Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CPU-Auslastung anzeigen (zum 1000000000000. Mal) (https://www.delphipraxis.net/8258-cpu-auslastung-anzeigen-zum-1000000000000-mal.html)

Dannyboy 1. Sep 2003 09:49


CPU-Auslastung anzeigen (zum 1000000000000. Mal)
 
Guden, wie komme ich denn nun an den prozentualen Wert der momentanen
CPU-Auslastung dran ???

Matze 1. Sep 2003 09:59

Re: CPU-Auslastung anzeigen (zum 1000000000000. Mal)
 
Hier habe ich das angewendet (läuft nur unter Win NT/2000/XP):

http://www.delphipraxis.net/internal...stung&start=60

Der Code dazu:

http://www.delphipraxis.net/internal...ght=matze+tool

Harp 13. Dez 2004 20:07

Re: CPU-Auslastung anzeigen (zum 1000000000000. Mal)
 
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]

Harp 14. Dez 2004 11:32

Re: CPU-Auslastung anzeigen (zum 1000000000000. Mal)
 
ich glaube nicht, dass dieser Code ein Memory-Leak verursacht. Ich habe nämlich, den Code ausgeklammert - doch das Problem besteht immer noch...
Best regards,
Harp


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz