c++ - 获取当前 CPU 利用率的方法在 Windows 10 上运行不可靠

标签 c++ windows winapi windows-10 cpu-usage

我一直在使用以下方法来获取整个计算机的当前 CPU 利用率:

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);

//Use a simple infinite loop to display the concept
for(;; ::Sleep(500))
{
    COORD coord = {0, 0};
    SetConsoleCursorPosition(hOut, coord);

    int nCpuUse = get_cpu_utilization_method_01();

    _tprintf(L"CPU Usage: %d\t", nCpuUse);
}


int get_cpu_utilization_method_01()
{
    int nRes = -1;

    FILETIME ftIdle, ftKrnl, ftUsr;
    if(GetSystemTimes(&ftIdle, &ftKrnl, &ftUsr))
    {
        static BOOL bUsedOnce = FALSE;
        static ULONGLONG uOldIdle = 0;
        static ULONGLONG uOldKrnl = 0;
        static ULONGLONG uOldUsr = 0;

        ULONGLONG uIdle = ((ULONGLONG)ftIdle.dwHighDateTime << 32) | ftIdle.dwLowDateTime;
        ULONGLONG uKrnl = ((ULONGLONG)ftKrnl.dwHighDateTime << 32) | ftKrnl.dwLowDateTime;
        ULONGLONG uUsr = ((ULONGLONG)ftUsr.dwHighDateTime << 32) | ftUsr.dwLowDateTime;

        //Only if we have previous values
        if(bUsedOnce)
        {
            ULONGLONG uDiffIdle = uIdle - uOldIdle;
            ULONGLONG uDiffKrnl = uKrnl - uOldKrnl;
            ULONGLONG uDiffUsr = uUsr - uOldUsr;

            if(uDiffKrnl + uDiffUsr)
            {
                //Calculate percentage
                nRes = (int)((uDiffKrnl + uDiffUsr - uDiffIdle) * 100 / (uDiffKrnl + uDiffUsr));

                //Check value and correct it (Just in case)
                if(nRes < 0)
                    nRes = 0;
                else if(nRes > 100)
                    nRes = 100;
            }
        }

        //Remember previous data
        bUsedOnce = TRUE;
        uOldIdle = uIdle;
        uOldKrnl = uKrnl;
        uOldUsr = uUsr;
    }

    return nRes;

}

但自 Windows 10 以来,我收到软件用户的报告,称此方法提供的读数可能是错误的。有人告诉我,它报告的值可以低至 Windows 任务管理器 显示值的一半。

我自己运行测试已经有一段时间了,它似乎有点接近笔记本电脑上任务管理器的读数,但是当我在配备英特尔酷睿的台式机上运行它时i7-4770 CPU @ 3.40GHz,具有 4 个物理核心和 8 个逻辑核心,读数似乎始终太低:

enter image description here

请注意,我在同一硬件上安装了 Windows 7(现在运行 Windows 10),并且当时它在 Windows 7 上运行得相当可靠。

那么有什么想法可以让它在 Windows 10 下工作吗?

最佳答案

试试这个:

#include "TCHAR.h"
#include "pdh.h"

static PDH_HQUERY cpuQuery;
static PDH_HCOUNTER cpuTotal;

void init(){
PdhOpenQuery(NULL, NULL, &cpuQuery);
PdhAddCounter(cpuQuery, L"\\Processor(_Total)\\% Processor Time", NULL, &cpuTotal);
PdhCollectQueryData(cpuQuery);
}

double getCurrentValue(){
PDH_FMT_COUNTERVALUE counterVal;

PdhCollectQueryData(cpuQuery);
PdhGetFormattedCounterValue(cpuTotal, PDH_FMT_DOUBLE, NULL, &counterVal);
return counterVal.doubleValue;
}

关于c++ - 获取当前 CPU 利用率的方法在 Windows 10 上运行不可靠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42100896/

相关文章:

c++ - 在派生类的构造函数中初始化父类(super class)

c++ - 通过参数传递变量并在稍后的类中对其进行修改

c++ - 将 double 转换为字符串,保持数字的高精度,C++

c++ - c++中有指针的析构函数吗?

windows - postgres 9.2 忘记密码

python - 等待多个 Python 进程在 Windows 7 CMD 中完成

c++ - 如何 CloseHandle 转换为 FILE* 的句柄?

visual-studio-2010 - Windows的等效于gettimeday()

c++ - 如何组织应用程序设置并根据设置类自动构建 GUI?

c++ - 启用视觉样式的日期和时间选择器 -> 更改标题的背景颜色