Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Windows API / MS.NET Framework API (https://www.delphipraxis.net/20-library-windows-api-ms-net-framework-api/)
-   -   Delphi CPU Auslastung einzelner Prozesse (https://www.delphipraxis.net/106890-cpu-auslastung-einzelner-prozesse.html)

chest3rs 18. Jan 2008 10:25


CPU Auslastung einzelner Prozesse
 
Mit diesen Funktionen errechnet man anhand der ProcessID die CPU Auslastung eines Prozesses. Die ProzessIDs müssen natülich vorher ermittelt werden.


Delphi-Quellcode:
// Datensatz für die CPU Auslastung
// Hier werden die Zeitwerte des Prozesses gespeichert
type
  TCPULOAD = record
    PID                   : Integer;
    dwOldTime, dwNewTime  : Cardinal;
    lOldUser, lNewUser    : Cardinal;
    lOldKernel, lNewKernel : Cardinal;
  end;

var
  Process      : TCPULOAD;

function GetTime(fFileTime: FileTime): Cardinal;
var
  sSystemTime : SystemTime;
begin
  FileTimeToSystemTime(fFileTime,sSystemTime);
  result := (sSystemTime.wSecond*1000)+sSystemTime.wMilliseconds;
end;

// aktualisiert Zeitwerte im Datensatz des Prozesses
procedure RefreshProcess(var Process: TCPULOAD);
var
  hProc : THandle;
  ftCreate, ftExit, ftUser, ftKernel : FileTime;
begin
  ZeroMemory(@ftUser, SizeOf(ftUser));
  ZeroMemory(@ftUser, SizeOf(ftKernel));

  Process.dwOldTime := Process.dwnewTime;
  Process.lOldUser  := Process.lNewUser;
  Process.lOldKernel := Process.lNewKernel;

  hProc := OpenProcess(PROCESS_QUERY_INFORMATION, False, Process.PID);
  if (hProc <> 0) then
  begin
    GetProcessTimes(hProc, ftCreate, ftExit, ftKernel, ftUser);
    Process.dwNewTime := GetTickCount;
    Process.lNewUser  := GetTime(ftUser);
    Process.lNewKernel := GetTime(ftKernel);
  end;
  CloseHandle(hProc);
end;

function GetCPUTimeForProcess(Process: TCPULOAD): Integer;
var
  lUser, lKernel: Cardinal;
  dwTime: DWORD;
begin
  lKernel := Process.lNewKernel - Process.lOldKernel;
  lUser  := Process.lNewUser  - Process.lOldUser;
  dwTime := Process.dwNewTime - Process.dwOldTime;
  if (dwTime > 0) then
    Result := ((lKernel+lUser)*100) div (dwTime)
  else
    Result := 0;
end;
Anwendungsbeispiel:

Delphi-Quellcode:
Process.PID := { gültige PID hier eintragen };

// Zeitwerte müssen auf null gesetzt werden
Process.lNewKernel := 0;
Process.lNewUser  := 0;
Process.dwNewTime := 0;

// speichert die aktuellen Zeitwerte im Datensatz
RefreshProcess(Process);

Label1.Caption := IntToStr(GetCPUTimeForProcess(Process)) +'%';
Bevor RefreshProcess ausgeführt wird, müssen die alten Zeitwerte auf null gesetzt werden, damit bei neuen Prozessen keine ungültigen Werte herauskommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:03 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