Bon, j'ai déporté les conversions après les mesures.
C'est ce que j'avais commencé à faire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 var hProcessHandle: THandle; lii: tagLASTINPUTINFO; nIdle1, nKernelTime1, nUserTime1, nIdle2, nKernelTime2, nUserTime2: Int64; lpCreationTime, lpExitTime, lpKernelTime1, lpUserTime1, lpKernelTime2, lpUserTime2: _FILETIME; // TFileTime lpsKernelTime, lpsUserTime: _SYSTEMTIME; dDeltaIdle, dDeltaKernelUser: Double; begin hProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessEntry.th32ProcessID); try //.Première mesure. lii.cbSize := SizeOf(tagLASTINPUTINFO); if not GetLastInputInfo(lii) then Exit; nIdle1 := lii.dwTime; if not GetProcessTimes(hProcessHandle, lpCreationTime, lpExitTime, lpKernelTime1, lpUserTime1) then begin Application.MessageBox(PChar('GetProcessTimes 1' + #13#10 + SysErrorMessage(GetLastError)), PChar(Caption + ' - erreur'), MB_ICONERROR + MB_OK); Exit; end; //.Pause. Sleep(500); //.Deuxième mesure. if not GetLastInputInfo(lii) then Exit; nIdle2 := lii.dwTime; if not GetProcessTimes(hProcessHandle, lpCreationTime, lpExitTime, lpKernelTime2, lpUserTime2) then begin Application.MessageBox(PChar('GetProcessTimes 2' + #13#10 + SysErrorMessage(GetLastError)), PChar(Caption + ' - erreur'), MB_ICONERROR + MB_OK); Exit; end; //.Conversions. if not FileTimeToSystemTime(lpKernelTime1, lpsKernelTime) then Exit; nKernelTime1 := (lpsKernelTime.wHour * 60 * 60 * 1000) + (lpsKernelTime.wMinute * 60 * 1000) + (lpsKernelTime.wSecond * 1000) + lpsKernelTime.wMilliseconds; if not FileTimeToSystemTime(lpUserTime1, lpsUserTime) then Exit; nUserTime1 := (lpsUserTime.wHour * 60 * 60 * 1000) + (lpsUserTime.wMinute * 60 * 1000) + (lpsUserTime.wSecond * 1000) + lpsUserTime.wMilliseconds; if not FileTimeToSystemTime(lpKernelTime2, lpsKernelTime) then Exit; nKernelTime2 := (lpsKernelTime.wHour * 60 * 60 * 1000) + (lpsKernelTime.wMinute * 60 * 1000) + (lpsKernelTime.wSecond * 1000) + lpsKernelTime.wMilliseconds; if not FileTimeToSystemTime(lpUserTime2, lpsUserTime) then Exit; nUserTime2 := (lpsUserTime.wHour * 60 * 60 * 1000) + (lpsUserTime.wMinute * 60 * 1000) + (lpsUserTime.wSecond * 1000) + lpsUserTime.wMilliseconds; //.Calculs (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;
Voici le détail quand j'obtiens 100 (par exemple):Et voici quand j'obtiens 0 :### MESURE 1 :
lpsKernelTime.wHour : 0 [0 * 60 * 60 * 1000 = 0]
lpsKernelTime.wMinute : 0 [0 * 60 * 1000 = 0]
lpsKernelTime.wSecond : 4 [4 * 1000 = 32000]
lpsKernelTime.wMilliseconds : 15
(0 * 60 * 60 * 1000) + (0 * 60 * 1000) + (4 * 1000) + 15 = 4015
lpsUserTime.wHour : 0 [0 * 60 * 60 * 1000 = 0]
lpsUserTime.wMinute : 0 [0 * 60 * 1000 = 0]
lpsUserTime.wSecond : 32 [32 * 1000 = 32000]
lpsUserTime.wMilliseconds : 265
(0 * 60 * 60 * 1000) + (0 * 60 * 1000) + (32 * 1000) + 265 = 32265
### MESURE 2 :
lpsKernelTime.wHour : 0 [0 * 60 * 60 * 1000 = 0]
lpsKernelTime.wMinute : 0 [0 * 60 * 1000 = 0]
lpsKernelTime.wSecond : 4 [4 * 1000 = 32000]
lpsKernelTime.wMilliseconds : 31
(0 * 60 * 60 * 1000) + (0 * 60 * 1000) + (4 * 1000) + 31 = 4031
lpsUserTime.wHour : 0 [0 * 60 * 60 * 1000 = 0]
lpsUserTime.wMinute : 0 [0 * 60 * 1000 = 0]
lpsUserTime.wSecond : 32 [32 * 1000 = 32000]
lpsUserTime.wMilliseconds : 296
(0 * 60 * 60 * 1000) + (0 * 60 * 1000) + (32 * 1000) + 296 = 32296
### CALCULS :
nIdle1 : 140328
nIdle2 : 140328
nKernelTime1 : 4015
nUserTime1 : 32265
nKernelTime2 : 4031
nUserTime2 : 32296
dDeltaIdle = 0
dDeltaKernelUser = 47Quand je regarde le détail, j'ai des valeurs bizarres qui semblent disparaitre quand je fais le calcul complet. Pourtant, un entier (logiquement) n'est pas sensé avoir de décimales cachées.### MESURE 1 :
lpsKernelTime.wHour : 0 [0 * 60 * 60 * 1000 = 0]
lpsKernelTime.wMinute : 0 [0 * 60 * 1000 = 0]
lpsKernelTime.wSecond : 3 [3 * 1000 = 31000]
lpsKernelTime.wMilliseconds : 953
(0 * 60 * 60 * 1000) + (0 * 60 * 1000) + (3 * 1000) + 953 = 3953
lpsUserTime.wHour : 0 [0 * 60 * 60 * 1000 = 0]
lpsUserTime.wMinute : 0 [0 * 60 * 1000 = 0]
lpsUserTime.wSecond : 31 [31 * 1000 = 31000]
lpsUserTime.wMilliseconds : 531
(0 * 60 * 60 * 1000) + (0 * 60 * 1000) + (31 * 1000) + 531 = 31531
### MESURE 2 :
lpsKernelTime.wHour : 0 [0 * 60 * 60 * 1000 = 0]
lpsKernelTime.wMinute : 0 [0 * 60 * 1000 = 0]
lpsKernelTime.wSecond : 3 [3 * 1000 = 31000]
lpsKernelTime.wMilliseconds : 953
(0 * 60 * 60 * 1000) + (0 * 60 * 1000) + (3 * 1000) + 953 = 3953
lpsUserTime.wHour : 0 [0 * 60 * 60 * 1000 = 0]
lpsUserTime.wMinute : 0 [0 * 60 * 1000 = 0]
lpsUserTime.wSecond : 31 [31 * 1000 = 31000]
lpsUserTime.wMilliseconds : 531
(0 * 60 * 60 * 1000) + (0 * 60 * 1000) + (31 * 1000) + 531 = 31531
### CALCULS :
nIdle1 : 126781
nIdle2 : 126781
nKernelTime1 : 3953
nUserTime1 : 31531
nKernelTime2 : 3953
nUserTime2 : 31531
dDeltaIdle = 0
dDeltaKernelUser = 0
Partager