1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| var
hProcessHandle: THandle;
lii: tagLASTINPUTINFO;
nDebut, nFin, nIdle1, nKernelTime1, nUserTime1, nIdle2, nKernelTime2, nUserTime2: Int64;
lpCreationTime, lpExitTime, lpKernelTime, lpUserTime: _FILETIME; // TFileTime
lpsKernelTime, lpsUserTime: _SYSTEMTIME;
dDeltaIdle, dDeltaKernelUser: Double;
begin
hProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessEntry.th32ProcessID);
try
//### PREMIERE MESURE. ###
lii.cbSize := SizeOf(tagLASTINPUTINFO);
if not GetLastInputInfo(lii) then
Exit;
nIdle1 := lii.dwTime;
if not GetProcessTimes(hProcessHandle, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime) then
begin
Application.MessageBox(PChar('GetProcessTimes 1' + #13#10 + SysErrorMessage(GetLastError)), PChar(Caption + ' - erreur'), MB_ICONERROR + MB_OK);
Exit;
end;
if not FileTimeToSystemTime(lpKernelTime, lpsKernelTime) then
Exit;
nKernelTime1 := (lpsKernelTime.wHour * 60 * 60 * 1000) + (lpsKernelTime.wMinute * 60 * 1000) + (lpsKernelTime.wSecond * 1000) + lpsKernelTime.wMilliseconds;
if not FileTimeToSystemTime(lpUserTime, lpsUserTime) then
Exit;
nUserTime1 := (lpsUserTime.wHour * 60 * 60 * 1000) + (lpsUserTime.wMinute * 60 * 1000) + (lpsUserTime.wSecond * 1000) + lpsUserTime.wMilliseconds;
//### Pause. ###
QueryPerformanceCounter(nDebut);
Sleep(500);
QueryPerformanceCounter(nFin);
// repeat
// QueryPerformanceCounter(nFin);
// until((nFin - nDebut) > 5000000000);
// ### DEUXIEME MESURE. ###
if not GetLastInputInfo(lii) then
Exit;
nIdle2 := lii.dwTime;
if not GetProcessTimes(hProcessHandle, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime) then
begin
Application.MessageBox(PChar('GetProcessTimes 2' + #13#10 + SysErrorMessage(GetLastError)), PChar(Caption + ' - erreur'), MB_ICONERROR + MB_OK);
Exit;
end;
if not FileTimeToSystemTime(lpKernelTime, lpsKernelTime) then
Exit;
nKernelTime2 := (lpsKernelTime.wHour * 60 * 60 * 1000) + (lpsKernelTime.wMinute * 60 * 1000) + (lpsKernelTime.wSecond * 1000) + lpsKernelTime.wMilliseconds;
if not FileTimeToSystemTime(lpUserTime, lpsUserTime) then
Exit;
nUserTime2 := (lpsUserTime.wHour * 60 * 60 * 1000) + (lpsUserTime.wMinute * 60 * 1000) + (lpsUserTime.wSecond * 1000) + lpsUserTime.wMilliseconds;
// ### CALCUL ###
//.NdisGetCurrentProcessorCounts [CpuUsage = 100-100*(Idle - Idle[n])/(KernelAndUser - KernelAndUser[n])].
dDeltaIdle := (nIdle2 - nIdle1);
dDeltaKernelUser := (nKernelTime2 + nUserTime2) - (nKernelTime1 + nUserTime1);
if dDeltaKernelUser = 0 then
dTempsProcesseur := 0
else
begin
dTempsProcesseur := dDeltaIdle / dDeltaKernelUser;
dTempsProcesseur := 100 - 100 * _dTempsProcesseur;
end;
finally
CloseHandle(hProcessHandle);
end; |
Partager