CPU Auslastung



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



  • Du musst so wie im Code davor die Funktion so machen, dass du 2 mal die Zeiten erfragst und beim 1. Aufruf die Werte speichern, damit du beim 2. Aufruf Zeitdifferenzen bilden kannst! Es sei denn du bist an der durchschnittlichen Auslastung seit Systemstart interessiert 😉

    [ Dieser Beitrag wurde am 25.02.2003 um 17:05 Uhr von flenders editiert. ]



  • wie kann das Ergebnis zwischen Speichern. Wenn ich das als Funktion habe und mit nem Timer aufrufe.



  • In einer globalen Variablen?! Oder static (da bin ich mir grad net ganz sicher)



  • Vielleicht solltest du auch mal überprüfen, bei welchem return er aus deiner Funktion aussteigt.



  • mit Blobalen Variablen ich weiß nich ich versuch die zahl so gering wie möglich zu halten, muss doch elleganter gehen werd es erstmal versuchen.



  • Wenn du nicht auf die Fragen der Leute eingehst, die helfen wollen, dann musst du dich nicht wundern, wenn du in 2 Wochen noch an diesem Problem sitzt!



  • hier schaut euch mal das an... steht doch wie immer alles in der registry.. 😉
    http://www.bytesandmore.de/rad/index.htm?http://www.bytesandmore.de/rad/cpp/snipp/sc03031.php



  • Hast du es mit static mal ausprobiert? 🙄



  • so hab es mit Sunday Sache getestet über die Registry versucht nur was ist ein AnsiString?



  • AnsiString ist glaube ich eine VCL-Klasse, aber schau dir mal das aus den FAQ zu der Registry!



  • @mosta:
    Der Tip mit der Registry war schon vor 30 Beiträgen vorgeschlagen worden!!!
    Das funktioniert aber nur unter Win98 etc. :p .
    Liest du eigentlich was die Leute schreiben 😕 ??

    MfG Spacelord



  • hab ich vergessen muss doch aber auch auf die selbe art unter xp irgendwie funktionieren



  • Original erstellt von Spacelord:
    Liest du eigentlich was die Leute schreiben 😕 ??

    Scheinbar nicht! 😮



  • So Leute kommts mal zur ner Lösung *gg*

    Kann doch nich so schwer sein *gg*



  • Lösung ! Lösung ! 😃



  • Ich hab mal was auf die Schnelle zusammengeschustert!

    #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;

    typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);

    PROCNTQSI NtQuerySystemInformation;

    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};

    char CPUAusgabe[6];

    // get number of processors in the system
    status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL);
    if (status != NO_ERROR)
    return;

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

    // get new CPU's idle time
    status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);
    if (status != NO_ERROR)
    return;

    // 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;

    sprintf(CPUAusgabe,"%3d%%",(UINT)dbIdleTime);
    SendMessage(hCPU,WM_SETTEXT,0,(LPARAM)CPUAusgabe);
    }

    // store new CPU's idle and system time
    liOldIdleTime = SysPerfInfo.liIdleTime;
    } liOldSystemTime = SysTimeInfo.liKeSystemTime;


Anmelden zum Antworten