【发布时间】:2020-10-27 09:11:03
【问题描述】:
我正在编写一个 C++ 函数来获取 Windows 中特定进程的 CPU 使用率。
许多参考资料(如this)建议使用函数GetProcessTimes 来实现。
但是,我尝试了一个示例程序,但 KernelTime 和 UserTime 的值不会随时间改变。
下面是我的代码:
#include <iostream>
#include <Windows.h>
int main()
{
int processID = 14532;
HANDLE processHandle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, processID);
if (processHandle == NULL) {
return -1;
}
FILETIME ftProcCreation, ftProcExit, ftProcKernel, ftProcUser;
for (int i = 0; i < 10; i++) {
if (!GetProcessTimes(GetCurrentProcess(), &ftProcCreation,
&ftProcExit, &ftProcKernel, &ftProcUser)) {
return -1;
}
LARGE_INTEGER lKernel, lUser;
lKernel.LowPart = ftProcKernel.dwLowDateTime;
lKernel.HighPart = ftProcKernel.dwHighDateTime;
lUser.LowPart = ftProcUser.dwLowDateTime;
lUser.HighPart = ftProcUser.dwHighDateTime;
printf("%lld : %lld\n", lKernel.QuadPart, lUser.QuadPart);
Sleep(250);
}
}
我检查的进程是一个正在运行的 Virtualbox 进程,它总是占用大约 20% 的 CPU。
但是,当我运行示例代码时,结果如下:
0 : 0
0 : 0
0 : 0
0 : 0
0 : 0
0 : 0
0 : 0
0 : 0
0 : 0
0 : 0
有时,它可能会给出以下结果:
312500 : 0
312500 : 0
312500 : 0
312500 : 0
312500 : 0
312500 : 0
312500 : 0
312500 : 0
312500 : 0
312500 : 0
同样,它可能会给出以下结果:
156250 : 0
156250 : 0
156250 : 0
156250 : 0
156250 : 0
156250 : 0
156250 : 0
156250 : 0
156250 : 0
156250 : 0
或者可能是:
0 : 156250
0 : 156250
0 : 156250
0 : 156250
0 : 156250
0 : 156250
0 : 156250
0 : 156250
0 : 156250
0 : 156250
以此类推,但“0:0”的值更多的是频率。
我的代码有什么问题,以至于它无法获得进程的内核/空闲时间吗?为什么值不随时间变化?
=======
【问题讨论】: