Einzelnen Beitrag anzeigen

Harp

Registriert seit: 13. Dez 2004
2 Beiträge
 
#3

Re: CPU-Auslastung anzeigen (zum 1000000000000. Mal)

  Alt 13. Dez 2004, 20:07
Ich habe eure Beiträge genossen und habe versucht das in c++ unter c++builder umzuschreiben. Es ist gut gelungen. Kann es sein, dass die Speicherauslastung (bei 4kb) ständig inkrementiert wird, wenn ein Timer verwendet wird, der die Methode X nach einem gegeben Intervall (1.Sek)aufruft, die diese GetCPUUsage verwendet? -
Diese Beobachtung habe ich mittels Task-Manager festgestellt. Vielleicht liege ich falsch - ich kann diese Feststellung noch nicht genau bestätigen.
Wenn jemand von euch c++ versteht, guckt mal rein, ob irgend etwas faul mit diesen Code ist.
Danke im Voraus!
Harp

Code:
//...header
#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;
//GetCPUUsage() gives the information about the system
//it is called and used by another class
double GetCPUUsage()
{
 SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
 SYSTEM_TIME_INFORMATION SysTimeInfo;
 SYSTEM_BASIC_INFORMATION SysBaseInfo;

 double dbIdleTime;
 double dbSystemTime;

 static LARGE_INTEGER liOldIdleTime = {0,0};
 static LARGE_INTEGER liOldSystemTime = {0,0};

 NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(
 GetModuleHandle("ntdll"),
 "NtQuerySystemInformation");


NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseI
nfo),NULL);

NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeIn
fo),0);

NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(Sy
sPerfInfo),NULL);

 if (liOldIdleTime.QuadPart != 0)
{ // if it's a first call - skip it
   // CurrentValue = NewValue - OldValue
   dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) -
Li2Double(liOldIdleTime);
   dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) -
Li2Double(liOldSystemTime);

   // CurrentCpuIdle = IdleTime / SystemTime
   dbIdleTime = dbIdleTime / dbSystemTime;

   dbIdleTime = 100.0 - dbIdleTime * 100.0 /
(double)SysBaseInfo.bKeNumberProcessors + 0.5;

 }
 liOldIdleTime = SysPerfInfo.liIdleTime;
 liOldSystemTime = SysTimeInfo.liKeSystemTime;

 return dbIdleTime;
}
//----------------------------------
[edit=Luckie]Code-Tags Mfg, Luckie[/edit]
  Mit Zitat antworten Zitat