就是这个类了,取得进行与线程的CPU使用率,也是从国外技术站上学来的
unit bCPUUsage;
interface
uses Windows, SysUtils, MMSystem;
const bWaitTime = 700;
type TCPUUsage = class private { Private declarations } FdtStartByThread: Int64; FdtCPUPrevByThread: Int64; FdtStartByProcess: Int64; FdtCPUPrevByProcess: Int64; public { Public declarations } constructor Create; destructor Destroy; override; function GetThreadCPUUsage: Int64; function ThreadCPUUsage: Int64; function GetProcessCPUUsage: Int64; function ProcessCPUUsage: Int64; end;
implementation
//类初始化 constructor TCPUUsage.Create; begin FdtStartByThread := 0; FdtCPUPrevByThread := 0; FdtStartByProcess := 0; FdtCPUPrevByProcess := 0; timeBeginPeriod(1); end;
//类注销 destructor TCPUUsage.Destroy; begin timeEndPeriod(1); end;
//取得CPU线程时间 function TCPUUsage.GetThreadCPUUsage: Int64; var CreationTime, ExitTime, KernelTime, UserTime: TFileTime; begin try Result := 0; if GetThreadTimes(GetCurrentThread, CreationTime, ExitTime, KernelTime, UserTime) then begin Result := Int64(KernelTime.dwLowDateTime or (KernelTime.dwHighDateTime shr 32)) + Int64(UserTime.dwLowDateTime or (UserTime.dwHighDateTime shr 32)); end; except Result := 0; end; end;
//取得线程CPU使用率 function TCPUUsage.ThreadCPUUsage: Int64; var timespan, dtThread: Int64; begin try Result := 0; timespan := 0; if (FdtStartByThread>0) and (FdtCPUPrevByThread>0) then begin timespan := timeGetTime() - FdtStartByThread; dtThread := GetThreadCPUUsage - FdtCPUPrevByThread; if (timespan>=bWaitTime) and (dtThread>0) then Result := Round(((dtThread / timespan) / 100) / 2) //这里就是取CPU使用率了,不知为何总要除以2 else Result := 0; end; if (timespan<=0) or (timespan>=bWaitTime) then FdtStartByThread := timeGetTime(); FdtCPUPrevByThread := GetThreadCPUUsage; except Result := 0; end; end;
//取得CPU进程时间 function TCPUUsage.GetProcessCPUUsage: Int64; var CreationTime, ExitTime, KernelTime, UserTime: TFileTime; begin try Result := 0; if GetProcessTimes(GetCurrentProcess, CreationTime, ExitTime, KernelTime, UserTime) then begin Result := Int64(KernelTime.dwLowDateTime or (KernelTime.dwHighDateTime shr 32)) + Int64(UserTime.dwLowDateTime or (UserTime.dwHighDateTime shr 32)); end; except Result := 0; end; end;
//取得进程CPU使用率 function TCPUUsage.ProcessCPUUsage: Int64; var timespan, dtProcess: Int64; begin try Result := 0; timespan := 0; if (FdtStartByProcess>0) and (FdtCPUPrevByProcess>0) then begin timespan := timeGetTime() - FdtStartByProcess; dtProcess := GetProcessCPUUsage - FdtCPUPrevByProcess; if (timespan>=bWaitTime) and (dtProcess>0) then Result := Round(((dtProcess / timespan) / 100) / 2) //这里就是取CPU使用率了,不知为何总要除以2 else Result := 0; end; if (timespan<=0) or (timespan>=bWaitTime) then FdtStartByProcess := timeGetTime(); FdtCPUPrevByProcess := GetProcessCPUUsage; except Result := 0; end; end;
initialization {initialization} finalization {finalization} end.
|