gpt4 book ai didi

C++ GetProcessTimes() 不会随时间改变值

转载 作者:行者123 更新时间:2023-12-02 09:53:01 30 4
gpt4 key购买 nike

我正在编写一个 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。
enter image description here
但是,当我运行示例代码时,结果如下:
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”的值更多的是频率。

我的代码有什么问题,以至于它无法获得进程的内核/空闲时间吗?为什么值(value)不会随着时间而改变?
=======

最佳答案

您正在查询当前进程 ( GetCurrentProcess() ) 的时间,而不是目标进程 ( processHandle )。由于GetProcessTimes()返回进程消耗的 CPU 时间,但您的进程并没有消耗太多时间,因为它大部分时间都在休眠,结果变化非常缓慢。
所以,通过 processHandle而不是 GetCurrentProcess()GetProcessTimes() .

关于C++ GetProcessTimes() 不会随时间改变值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62769697/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com