CPU Auslastung



  • 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.



  • Du ermittelst über die Aufrufe von NtQuerySystemInformation nur die Systemzeit und die Idle-Time (Leerlauf), daraus wird dann die Prozessorauslastung berechnet 😉



  • ungefähr so teste es später bin nicht zuhause.

    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; 
    
    // 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; 
    
    return  dbIdleTime; 
    }
    


  • es funktioniert nicht er zeigt mir immer noch nur die 0 bei CPU Auslastung an.
    Was mach ich falsch am anfang hol ich mir doch die Werte aus NtQuerySystemInformation und lass dann die Auslastung berrechnen, so wie im Bsp. , nur das ich daraus ne funktion machen will.

    [ Dieser Beitrag wurde am 25.02.2003 um 16:39 Uhr von mosta editiert. ]


Anmelden zum Antworten