【问题标题】:C++ GetProcessTimes() does not change value over timeC++ GetProcessTimes() 不会随时间改变值
【发布时间】: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”的值更多的是频率。
我的代码有什么问题,以至于它无法获得进程的内核/空闲时间吗?为什么值不随时间变化?

=======

【问题讨论】:

    标签: c++ windows


    【解决方案1】:

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

    所以,将processHandle 而非GetCurrentProcess() 传递给GetProcessTimes()。

    【讨论】:

      猜你喜欢
      • 2017-05-17
      • 1970-01-01
      • 2020-07-09
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多