Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Durch eigenen Prozess verursachte CPU-Auslastung bekommen??? (https://www.delphipraxis.net/46424-durch-eigenen-prozess-verursachte-cpu-auslastung-bekommen.html)

romber 24. Mai 2005 20:31


Durch eigenen Prozess verursachte CPU-Auslastung bekommen???
 
Hallo!

Wie man die aktuelle CPU-Aulastung erhält, haben Matze und eigene Teilnemer bereits mehrmals beschrieben. Gibt es auch eine Möglichkeit, die CPU-Auslastung der einzelnen Prozesse zu bekommen, zum Beispiel die des eigenen Prozesses? Das wäre schön!

Mindestens einen Beitrag gab's bereits zu diesem Thema, hier:
CPU auslastung der einzelnen Prozesse

Zitat:

Zitat von supermuckl
Stichwort Perfmon ( Performance Monitor )
Ist eine API Schnittstelle wo du auf die Counters von Windows zugreifen kannst. Darunter fallen auch alle Prozesse und ihre Messwerte/Statistiken an. Entsprechende Perfmon Komponenten für Delphi gibt es. Habe selbst eine schon ausprobiert.

Aber was für Komponenten meinte supermuckl und wo finde ich diese?

Danke!

DP-Maintenance 24. Mai 2005 20:32

DP-Maintenance
 
Dieses Thema wurde von "Luckie" von "Object-Pascal / Delphi-Language" nach "Windows API / MS.NET Framework API" verschoben.
WinAPI Frage.

Basilikum 24. Mai 2005 21:47

Re: Durch eigenen Prozess verursachte CPU-Auslastung bekomme
 
wenn es nur um den CPU-Load des eigenen Processes geht, ist dies sehr einfach:
Delphi-Quellcode:
var
  LastTick : LongWord;
  LastTime : Int64;
  CPUCount : Word;


// einmal initialisieren:

Var
  CreationTime,
  ExitTime,
  KernelTime,
  UserTime : TFILETIME;
  SystemInfo : TSystemInfo
Begin
  LastTick:=GetTickCount();

  GetProcessTimes(GetCurrentProcess(),CreationTime,ExitTime,KernelTime,UserTime);
  LastTime:=Int64(KernelTime) + Int64(UserTime);

  GetSystemInfo(SystemInfo);
  CPUCount:=SystemInfo.dwNumberOfProcessors;


// periodisch aufrufen (z.B. jede Sekunde):

Var
  CreationTime,
  ExitTime,
  KernelTime,
  UserTime : TFILETIME;
  TickDelta : LongWord;
  TimeDelta : Int64;
begin
  TickDelta:=GetTickCount() - LastTick;
  Inc(LastTick,TickDelta);

  GetProcessTimes(GetCurrentProcess(),CreationTime,ExitTime,KernelTime,UserTime);
  TimeDelta:=(Int64(KernelTime) + Int64(UserTime)) - LastTime;
  Inc(LastTime,TimeDelta);

  Label.Caption:=Format('CPU load: %.1f %%',[TimeDelta / 10000 / CPUCount / TickDelta * 100]);
PS: ev. wäre dies etwas für die Codelib, da diese Frage immer wieder kommt......

Luckie 24. Mai 2005 21:49

Re: Durch eigenen Prozess verursachte CPU-Auslastung bekomme
 
Und für alle anderen Prozesse
Delphi-Quellcode:
GetProcessTimes(GetCurrentProcess(),CreationTime,ExitTime,KernelTime,UserTime);
als ersten Parameter eben die ProzessID abgeben.

Basilikum 24. Mai 2005 22:41

Re: Durch eigenen Prozess verursachte CPU-Auslastung bekomme
 
Zitat:

Zitat von Luckie
Und für alle anderen Prozesse
Delphi-Quellcode:
GetProcessTimes(GetCurrentProcess(),CreationTime,ExitTime,KernelTime,UserTime);
als ersten Parameter eben die ProzessID abgeben.

GetProcessTimes() erwartet ein Process-Handle (nicht ID)...
GetCurrentProcess() liefert ein Pseudo-Handle des gegenwärtigen Prozesses... dementsprechend mittels OpenProcess() den Handle des fremden Prozesses holen...

Luckie 24. Mai 2005 22:47

Re: Durch eigenen Prozess verursachte CPU-Auslastung bekomme
 
OK, knapp da neben. ;)

Basilikum 24. Mai 2005 23:24

Re: Durch eigenen Prozess verursachte CPU-Auslastung bekomme
 
"Knapp daneben ist auch vorbei..." ;-)

romber 25. Mai 2005 01:14

Re: Durch eigenen Prozess verursachte CPU-Auslastung bekomme
 
Danke für schnelle Antwort!

Kann man die Kode von Basilikum in einen Thread packen? Ich versuche es jetzt gerade, klappt aber nicht so richtig. An dieser Zeile

Delphi-Quellcode:
Form1.Label1.Caption := Format('CPU load: %.1f %%',[TimeDelta / 10000 / CPUCount / TickDelta * 100]);
bricht es ab mit der Fehlermeldung:
Invalid floating pointer operation.

Woran liegt es?

Luckie 25. Mai 2005 01:29

Re: Durch eigenen Prozess verursachte CPU-Auslastung bekomme
 
1. Gibt der Code van Basilikum an wie viel CPU-Zeit der Prozess verbraucht und nicht die Auslastung in Prozent.
MSDN-Library durchsuchenGetProcessTimes
Zitat:

lpKernelTime
[out] Pointer to a FILETIME structure that receives the amount of time that the process has executed in kernel mode. The time that each of the threads of the process has executed in kernel mode is determined, and then all of those times are summed together to obtain this value.
lpUserTime
[out] Pointer to a FILETIME structure that receives the amount of time that the process has executed in user mode. The time that each of the threads of the process has executed in user mode is determined, and then all of those times are summed together to obtain this value.
2. Wenn du die TThread Klasse benutzt darfst du nur mit der Synchronize Methode auf VCL Objekte einer Form zugreifen
3. Überprüf mal die Inahlte der variablen, was darin steht.

Basilikum 25. Mai 2005 07:54

Re: Durch eigenen Prozess verursachte CPU-Auslastung bekomme
 
Zitat:

Zitat von Luckie
1. Gibt der Code van Basilikum an wie viel CPU-Zeit der Prozess verbraucht und nicht die Auslastung in Prozent.
MSDN-Library durchsuchenGetProcessTimes
Zitat:

lpKernelTime
[out] Pointer to a FILETIME structure that receives the amount of time that the process has executed in kernel mode. The time that each of the threads of the process has executed in kernel mode is determined, and then all of those times are summed together to obtain this value.
lpUserTime
[out] Pointer to a FILETIME structure that receives the amount of time that the process has executed in user mode. The time that each of the threads of the process has executed in user mode is determined, and then all of those times are summed together to obtain this value.

1. stimmt nicht: GetProcessTimes liefert tatsächlich "nur" die verbratene CPU-Zeit... diese wird jedoch mit der Division durch die verstrichenen Ticks mit der "echten" Zeit in Relation gebracht, und ergibt so den prozentualen Anteil der Zeit, die der Process während der letzen Berechnungsperiode tatsächlich den CPU beansprucht hat... bei CPU-Zeit = verstrichene Ticks => 100%, bei CPU-Zeit = 0 => 0%


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:49 Uhr.
Seite 1 von 2  1 2      

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