tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
3054
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von schnuffie
    schnuffie schnuffie ist offline Mitglied Platin
    Registriert seit
    Oct 2004
    Ort
    Ober-Roden (Hessen)
    Beiträge
    725
    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.

  2. #2
    MeinerEiner_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
    PHP-Code:
    long differenz =0;
    long t1t2;
    for(
    int i=0100;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
    PS: Ich hab das ganze in einer Schleife laufen lassen, um eventuelle Unregelmässigkeiten abzufangen.
    Geändert von MeinerEiner_80 (08.03.06 um 18:11 Uhr) Grund: Tippfehler
     

  3. #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ß Tom
    Angehängte Dateien Angehängte Dateien
     
    Java 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

  4. #4
    Avatar von schnuffie
    schnuffie schnuffie ist offline Mitglied Platin
    Registriert seit
    Oct 2004
    Ort
    Ober-Roden (Hessen)
    Beiträge
    725
    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.

  5. #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 Tom
     
    Java 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

  6. #6
    merklepa merklepa ist offline Grünschnabel
    Registriert seit
    Oct 2011
    Beiträge
    2
    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
     

  7. #7
    genodeftest genodeftest ist offline Mitglied Brillant
    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)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  8. #8
    merklepa merklepa ist offline Grünschnabel
    Registriert seit
    Oct 2011
    Beiträge
    2
    Naja das ist schon nicht schlecht jedoch würde trotzdem gerne wissen wie es mit jni geht bzw wo der fehler liegt
     

Ähnliche Themen

  1. extreme prozessorlast in 3dstudio max_ warum?
    Von Schakalzzzz im Forum 3D Studio Max
    Antworten: 1
    Letzter Beitrag: 29.05.07, 11:30
  2. CGI auswerten
    Von kurcob im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 0
    Letzter Beitrag: 31.12.06, 10:07
  3. Zu hohe Prozessorlast bei SDL-Programm
    Von daddz im Forum C/C++
    Antworten: 24
    Letzter Beitrag: 04.03.05, 18:12
  4. Antworten: 5
    Letzter Beitrag: 05.07.04, 21:28
  5. max. Prozessorlast vorgeben
    Von TobiTo im Forum Visual Basic 6.0
    Antworten: 5
    Letzter Beitrag: 18.11.03, 15:22