ERLEDIGT
NEIN
NEIN
ANTWORTEN
7
7
ZUGRIFFE
3054
3054
EMPFEHLEN
-
08.03.06 14:39 #1
Hallo Experten,
ich habe ein Java-Programm, das "Nebensächlichkeiten" erledigt. Dazu gehören z.B. Packroutinen, Sortierereien, ect.. Das Programm soll neben weiteren auch Nicht-Java-Programmen laufen, die zu unterschiedlichen Zeiten unterschiedliche Prozessorlast erzeugen.
Mein "Nebenbei"-Programm erledigt zeitunkritische Dinge und soll nur laufen, wenn die Prozessorlast unter 40% ist, sonst wieder nach mindestens 5min Lauf pausieren.
Mit Thread.MIN_PRIORITY komme ich nicht weiter, da es nicht nur um Java-Programme geht und je nach CPU dieses Flag ggf. garnicht ausgewertet wird, soweit ich weiß.
Wie kann man unter Java die Prozessorlast auslesen/auswerten?
CU schnuffie
Fragliche Fragen stellende Fragensteller sind für verantwortungslose Antworten antwortender verantwortlicher Antworter selbst verantwortlich.
-
08.03.06 18:00 #2MeinerEiner_80 Tutorials.de Gastzugang
Servus!
Mir ist keine Funktion bekannt, mit der man mittels Java die Prozessorauslastung auslesen kann. Lasse mich da aber gerne eines besseren belehren.
Wie wäre es aber, wenn du die Systemzeit misst, den Thread.sleep() aufrufst und dann erneut die Systemzeit misst? Je nachdem wie die Prozessorauslastung ist, müsste es unterschiedliche Differenzen geben.
Ich hab mal folgenden Code mit und ohne eingeschalteten DVD-Player ablaufen lassen, und man kann schon Auffälligkeiten erkennen. Vielleicht hilft dir das ja weiter, falls niemand ne bessere Idee hat.
*grüssle*
MeinerEiner
PS: Ich hab das ganze in einer Schleife laufen lassen, um eventuelle Unregelmässigkeiten abzufangen.PHP-Code:long differenz =0;
long t1, t2;
for(int i=0; i < 100;i++){
t1 = System.nanoTime();
try {
Thread.sleep(10,0);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t2 = System.nanoTime();
differenz = differenz +t2-t1;
}
differenz = differenz/100;
Geändert von MeinerEiner_80 (08.03.06 um 18:11 Uhr) Grund: Tippfehler
-
08.03.06 22:16 #3
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo!
Aufbauen auf: http://www.codeproject.com/system/cpuusage.asp
kann man sich via JNI ganz flott eine passende dll Zaubern:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
// cpuutils.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung. // #include "stdafx.h" #include "de_tutorials_CPUUsageExample.h" #include "CpuUsage.h" #include <iostream> using namespace std; CCpuUsage usageA; BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved){ cout << "JNI_OnLoad" << endl; return JNI_VERSION_1_4; } /* * Class: de_tutorials_CPUUsageExample * Method: getCPUUsage * Signature: ()I */ JNIEXPORT jint JNICALL Java_de_tutorials_CPUUsageExample_getCPUUsage (JNIEnv *env, jclass clazz){ return usageA.GetCpuUsage(); }
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
/** * */ package de.tutorials; /** * @author Tom * */ public class CPUUsageExample { static{ System.loadLibrary("cpuutils"); } /** * @param args */ public static void main(String[] args) throws Exception{ while(true){ System.out.println(getCPUUsage()); Thread.sleep(1000L); } } public static native int getCPUUsage(); }
Ausgabe:
Code :1 2 3 4 5 6 7 8 9 10 11 12
JNI_OnLoad 0 5 6 2 7 7 14 9 4 1 ...
Die dll muss man dann einfach dorthin legen wo die JVM sie finden kann...
(entweder ein Pfad der in java.libarary.path drinnen steht oder in den normalen PATH) windows\system32 ist in der Regel ein guter Platz...
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
09.03.06 09:00 #4
Klingt ja interessant Tom, die Native-Möglichkeit. Habe Deine DLL mal eben in mein JVM-BIN gelegt und probiert. Die DLL wird gefunden, doch leider die Methode nicht.
Code :1 2 3
[SIZE=2][COLOR=#ff0000]java.lang.UnsatisfiedLinkError: getCPUUsage at CPUAuslastung.getCPUUsage([/COLOR][/SIZE][U][SIZE=2][COLOR=#000080]Native Method[/COLOR][/SIZE][/U][SIZE=2][COLOR=#000080][/COLOR][/SIZE][SIZE=2][COLOR=#ff0000]) [/COLOR][/SIZE]
Woran kann das liegen?
------------------------------------------------------------------------------------------------------------------------------
Hallo MeinerEiner_80,
klingt auch interessant, könnte nur etwas schwierig werden, wann die Systemzeit länger braucht.CU schnuffie
Fragliche Fragen stellende Fragensteller sind für verantwortungslose Antworten antwortender verantwortlicher Antworter selbst verantwortlich.
-
09.03.06 10:00 #5
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo!
Wenn du den Code des Beispiels aufrufst wirds klappen. Bei JNI werden die Namen der Klasse welche die Native(n) Methode(n) enthaelt miteinkompiliert... so kannst du die Native Methode nicht an einer anderen Klasse aufrufen, weil diese in dieser Form nicht in der dll registriert sind.
Gruss TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
Hey,
ich würde gerne eine eigene DLL erstellen.
Mit deiner DLL funktioniert das Programm einwandfrei.
Bei mir kommen immer folgende Fehlermeldungen nach eingabe des Befehls:
Befehl:
g++ -mno-cygwin -I"INCLUDEJAVAPFAD" -I"INCLUDEJAVAWIN32Pfad" -I"PFADINDEMSICHDIEHDATEIBEFINDET" -Wl,-add-stdcall-alias -shared -o cpuutils.dll cpuutils.cpp
Fehlermeldung:
C:\DOKUME~1\benutzer\LOKALE~1\Temp\cc0uRyfq.o:cpuutils.cpp
.text+0x4d): undefined
reference to `CCpuUsage::GetCpuUsage()'
C:\DOKUME~1\Benutzer\LOKALE~1\Temp\cc0uRyfq.o:cpuutils.cpp
.text+0x77): undefined
reference to `CCpuUsage::~CCpuUsage()'
C:\DOKUME~1\Benutzer\LOKALE~1\Temp\cc0uRyfq.o:cpuutils.cpp
.text+0xb2): undefined
reference to `CCpuUsage::CCpuUsage()'
collect2: ld returned 1 exit status
Was mach ich falsch?
Viele Dank schon mal im Voraus
Grüße
-
24.10.11 13:58 #7
- Registriert seit
- Jun 2009
- Beiträge
- 870
nutze doch einfach JNA, damit brauchst du keine eigene DLL mehr erstellen: https://secure.wikimedia.org/wikiped..._Native_Access
Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.Code java:1
System.out.println("Hallo");
___________
Ubuntu Bug #1: Microsoft has a majority market share
Casecon: Projekt leiser Käse
-
Naja das ist schon nicht schlecht jedoch würde trotzdem gerne wissen wie es mit jni geht bzw wo der fehler liegt
Ähnliche Themen
-
extreme prozessorlast in 3dstudio max_ warum?
Von Schakalzzzz im Forum 3D Studio MaxAntworten: 1Letzter Beitrag: 29.05.07, 11:30 -
CGI auswerten
Von kurcob im Forum CGI, Perl, Python, Ruby, Power ShellAntworten: 0Letzter Beitrag: 31.12.06, 10:07 -
Zu hohe Prozessorlast bei SDL-Programm
Von daddz im Forum C/C++Antworten: 24Letzter Beitrag: 04.03.05, 18:12 -
Auswerten von Strömen (zugestreamte HTML-Quelltexte auswerten)
Von metacortex im Forum JavaAntworten: 5Letzter Beitrag: 05.07.04, 21:28 -
max. Prozessorlast vorgeben
Von TobiTo im Forum Visual Basic 6.0Antworten: 5Letzter Beitrag: 18.11.03, 15:22





Zitieren

Login





