我正在编写一个C++函数,以获得特定进程在Windows中的CPU使用情况。
许多参考资料(如这)建议使用函数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进程,它总是占用CPU的大约20%。

但是,当我运行示例代码时,结果如下:
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“的值更频繁。
我的代码有什么问题吗?这样它就不能获得进程的内核/空闲时间?为什么值不随时间变化?
=======
发布于 2020-07-07 07:06:41
您正在查询当前进程(GetCurrentProcess())的时间,而不是目标进程(processHandle)的时间。因为GetProcessTimes()返回进程消耗的CPU时间,但是您的进程并没有花费太多的时间,因为它大多处于休眠状态,所以结果的变化非常缓慢。
因此,将processHandle而不是GetCurrentProcess()传递给GetProcessTimes()。
https://stackoverflow.com/questions/62769697
复制相似问题