CPU Auslastung



  • Original erstellt von Spacelord:
    **Ist etwas umfangreicher zumal du die benötigten struct's selber deklarieren musst weil es zur ntdll.dll keinen Header gibt.Hab heute leider keine Zeit mehr aber wenns bis morgen Zeit hat helf ich dir gerne weiter 🙂

    MfG Spacelord :)**

    ok dann warte ich





  • @ JSFreak wenn ich damit nicht klar komme, dann reicht das doch oder dann steht deine Sache doch garnicht mehr zur Debatte.(nichts gegen dich)

    und bitte lass das nicht wieder in eine Beleidigungsorgie enden (mit dir hatte ich glaub ich noch keine. Wir wollen aber doch das niveou anheben)

    das war rein deklaratorich



  • Ich habs mir fast gedacht, dass wieder so ein dummer Kommentar von mosta kommt. Willst die Lösung mal wieder in den Ar5ch geschoben bekommen. :o



  • du solltest dich wirklich nicht so dämlich anstellen mosta. die lösung läßt sich in einer minute mit google finden. ich dachte du wolltest beruflich etwas in richtung programmierung machen. 🙄



  • gefunden hat ich den schon vorher nur ich hab es nicht zun laufen gebracht also seit ruhig. Man muss doch nicht immer ein Kommentar abgeben

    #include <windows.h> 
    #include <conio.h> 
    #include <stdio.h> 
    #define SystemBasicInformation 0 
    #define SystemPerformanceInformation 2 
    #define SystemTimeInformation 3 
    
    #define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart)) 
    
    typedef struct 
    { 
    DWORD dwUnknown1; 
    ULONG uKeMaximumIncrement; 
    ULONG uPageSize; 
    ULONG uMmNumberOfPhysicalPages; 
    ULONG uMmLowestPhysicalPage; 
    ULONG uMmHighestPhysicalPage; 
    ULONG uAllocationGranularity; 
    PVOID pLowestUserAddress; 
    PVOID pMmHighestUserAddress; 
    ULONG uKeActiveProcessors; 
    BYTE bKeNumberProcessors; 
    BYTE bUnknown2; 
    WORD wUnknown3; 
    } SYSTEM_BASIC_INFORMATION; 
    
    typedef struct 
    { 
    LARGE_INTEGER liIdleTime; 
    DWORD dwSpare[76]; 
    } SYSTEM_PERFORMANCE_INFORMATION; 
    
    typedef struct 
    { 
    LARGE_INTEGER liKeBootTime; 
    LARGE_INTEGER liKeSystemTime; 
    LARGE_INTEGER liExpTimeZoneBias; 
    ULONG uCurrentTimeZoneId; 
    DWORD dwReserved; 
    } SYSTEM_TIME_INFORMATION; 
    
    // ntdll!NtQuerySystemInformation (NT specific!) 
    // 
    // The function copies the system information of the 
    // specified type into a buffer 
    // 
    // NTSYSAPI 
    // NTSTATUS 
    // NTAPI 
    // NtQuerySystemInformation( 
    // IN UINT SystemInformationClass, // information type 
    // OUT PVOID SystemInformation, // pointer to buffer 
    // IN ULONG SystemInformationLength, // buffer size in bytes 
    // OUT PULONG ReturnLength OPTIONAL // pointer to a 32-bit 
    // // variable that receives 
    // // the number of bytes 
    // // written to the buffer 
    // ); 
    typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG); 
    
    PROCNTQSI NtQuerySystemInformation; 
    
    double CPUAuslastung(void) 
    { 
    SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo; 
    SYSTEM_TIME_INFORMATION SysTimeInfo; 
    SYSTEM_BASIC_INFORMATION SysBaseInfo; 
    double dbIdleTime; 
    double dbSystemTime; 
    LONG status; 
    LARGE_INTEGER liOldIdleTime = {0,0}; 
    LARGE_INTEGER liOldSystemTime = {0,0}; 
    
    NtQuerySystemInformation = (PROCNTQSI)GetProcAddress( 
    GetModuleHandle("ntdll"), 
    "NtQuerySystemInformation" 
    ); 
    
    if (!NtQuerySystemInformation) 
    return 0; 
    
    // get number of processors in the system 
    status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL); 
    if (status != NO_ERROR) 
    return 0; 
    
    // get new system time 
    status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0); 
    if (status!=NO_ERROR) 
       return 0; 
    
    // get new CPU's idle time 
    status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL); 
    if (status != NO_ERROR) 
       return 0; 
    
    // if it's a first call - skip it 
    if (liOldIdleTime.QuadPart != 0) 
       { 
       // CurrentValue = NewValue - OldValue 
       dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime); 
      dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime); 
    
       // CurrentCpuIdle = IdleTime / SystemTime 
       dbIdleTime = dbIdleTime / dbSystemTime; 
    
       // CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors 
       dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors + 0.5; 
    
       }        
    
    // store new CPU's idle and system time 
    liOldIdleTime = SysPerfInfo.liIdleTime; 
    liOldSystemTime = SysTimeInfo.liKeSystemTime; 
    
    // wait one second 
    //Sleep(1000); wird von nem Timer übernomen
    
    return  dbIdleTime; 
    }
    

    da sin noch fehler drin aber deswegen hab ich es ja hierhin gepackt.

    [ Dieser Beitrag wurde am 23.02.2003 um 18:46 Uhr von mosta editiert. ]



  • Hat sich das jetzt erledigt?



  • nein da ich versucht habe den Code einzubinden nur die Ausgabe war konstant 0.



  • Läßt sich doch garnicht kompilieren. Eine void-Funktion kann doch nicht 0 zurückgeben. 🙄



  • achso das war aber nicht der grund warum es sich nicht kompilieren, lies die main funktion fehlte. aber dann funktioniert es auch mit der richtigen ausgabe



  • ich hab das zu ner funktion umgeschreiben mit nem double als rückgabewert so das das ganze wieder Stimmig ist. Ich änder es dann jetzt nochmal siehe oben.

    // get new system time 
       status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0); 
       if (status!=NO_ERROR) 
       return 0;
    

    hier gibt er mir nen falschen wert zurück wenn ich anzeige also return status mache dann kommt ne hohe minus Zahl.



  • Bereichsüberschreitung?!



  • bitte poste die zahl.



  • @ flenders wie kann ich das umgehen



  • Eine anderen Typ für den Rückgabewert nehmen 😉 Laut Doku ist muss dies NTSTATUS sein (weiß zwar net, wie das definiert ist, aber egal 🙄 )

    [ Dieser Beitrag wurde am 23.02.2003 um 19:00 Uhr von flenders editiert. ]



  • ich probiers mal aus



  • funktioniert nicht



  • ich krieg die Fehlermeldung Typ nicht definiert.



  • ist doch auch wurscht. der rückgabewert der funktion ist ja nicht die cpu-auslastung sondern der fehlercode.



  • Das soll auch ne Funktion sein die mir die CPU Auslastung zurück gibt und nicht den Fehlercode oder hab ich das wieder Falsch verstanden.


Anmelden zum Antworten