C++ 获取当前CPU利用率的方法是';无法在Windows 10上可靠地工作

C++ 获取当前CPU利用率的方法是';无法在Windows 10上可靠地工作,c++,windows,winapi,windows-10,cpu-usage,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_uti

我一直在使用以下方法获取整个计算机的当前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;

}
HANDLE hOut=GetStdHandle(标准输出句柄);
//使用简单的无限循环来显示概念
对于(;::睡眠(500))
{
COORD COORD={0,0};
设置控制台位置(hOut,coord);
int nCpuUse=get_cpu_ustilization_method_01();
_tprintf(L“CPU使用率:%d\t”,nCpuUse);
}
int get_cpu_利用率_方法_01()
{
int nRes=-1;
文件时ftIdle、ftKrnl、ftUsr;
if(GetSystemTimes(&ftIdle,&ftKrnl,&ftUsr))
{
静态BOOL-bUsedOnce=FALSE;
静态ULONGLONG uOldIdle=0;
静态ULONGLONG uOldKrnl=0;
静态ULONGLONG uOldUsr=0;
ULONGLONG uIdle=((ULONGLONG)ftIdle.dwHighDateTime尝试以下方法:

#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;
}

使用性能counters@DavidHeffernan:您知道,有趣的是,
taskmgr.exe
本身并不使用
性能计数器
,或
pdh.dll
@c0000fd-I计算每个进程和空闲进程的cpu使用率(这是整个计算机的100-
cpu使用率
)到了win10,我得到了与taskmgr相同的结果。但是这是使用本机api和来自
系统处理信息的时间
谢谢。我可以调用
getCurrentValue
的最小频率是多少?我也不确定它将如何处理多处理器/核心系统。我需要使用这些标志中的任何一个吗
PDH\U FMT\U NOCAP100|PDH_FMT_NOSCALE
对于
PdhGetFormattedCounterValue
调用,您能详细说明一下吗?@c0000fd:“我调用getCurrentValue的最小频率是多少?”-零。你是想问最大频率吗?@IInspectable:不,这就是我的意思。你看,我发布的方法不能连续调用两次才能得到可靠的结果。我想这些调用之间应该至少有250毫秒。换句话说,收集信息需要一些时间。这就是我在这里问的原因。