AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi CPU-Auslastung anzeigen (zum 1000000000000. Mal)
Thema durchsuchen
Ansicht
Themen-Optionen

CPU-Auslastung anzeigen (zum 1000000000000. Mal)

Ein Thema von Dannyboy · begonnen am 1. Sep 2003 · letzter Beitrag vom 14. Dez 2004
Antwort Antwort
Dannyboy

Registriert seit: 4. Aug 2003
Ort: Delphi-Heaven
418 Beiträge
 
Delphi 7 Personal
 
#1

CPU-Auslastung anzeigen (zum 1000000000000. Mal)

  Alt 1. Sep 2003, 10:49
Guden, wie komme ich denn nun an den prozentualen Wert der momentanen
CPU-Auslastung dran ???
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#2

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

  Alt 1. Sep 2003, 10:59
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
  Mit Zitat antworten Zitat
Harp

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

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

  Alt 13. Dez 2004, 21: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
Harp

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

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

  Alt 14. Dez 2004, 12:32
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:28 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