type
TProcessCpuUsage = record
private
FLastUsed, FLastTime: Int64;
FCpuCount: Integer;
public
class function Create: TProcessCpuUsage; static;
function Current(ProcessID: DWORD): Single;
end;
class function TProcessCpuUsage.Create: TProcessCpuUsage;
begin
Result.FLastTime := 0;
Result.FLastUsed := 0;
end;
function TProcessCpuUsage.Current(ProcessID: DWORD): Single;
var
Usage, ACurTime: UInt64;
CreateTime, ExitTime, IdleTime, UserTime, KernelTime: TFileTime;
hProcess: THandle;
CpuCount: Integer;
//FileTime转化为Int64
function FileTimeToI64(const ATime: TFileTime): Int64;
begin
Result := (Int64(ATime.dwHighDateTime) shl 32) + ATime.dwLowDateTime;
end;
//获取逻辑CPU数量
function GetCPUCount: Integer;
var
SysInfo: TSystemInfo;
begin
GetSystemInfo(SysInfo);
Result := SysInfo.dwNumberOfProcessors;
end;
begin
Result := 0;
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessID);
if GetProcessTimes(hProcess, CreateTime, ExitTime, KernelTime, UserTime) then
begin
ACurTime := GetTickCount;
Usage := FileTimeToI64(UserTime) + FileTimeToI64(KernelTime);
CpuCount := GetCPUCount;
if (FLastTime <> 0) then
//(这次使用量 - 上一次使用量) / (这次时间-上一次时间)/逻辑CPU核数
Result := (Usage - FLastUsed) / (ACurTime - FLastTime) / FCpuCount / 100;
FLastUsed := Usage;
FLastTime := ACurTime;
end;
end;
delphi进程的CPU占比计算
于 2024-05-08 09:14:19 首次发布