C++ - 以赫兹 (Windows) 查找当前 CPU 用法

C++ - Find current CPU usage in Hertz (Windows)

现状:
我想尝试测量我的系统当前 CPU 赫兹利用率。

我查看了 this answer,它解决了我的问题,但我似乎无法使代码正常工作。

这是我目前在main.cpp中的代码(来自答案):

#include <Pdh.h>
#include <PdhMsg.h>
#include <Windows.h>

static PDH_HQUERY cpuQuery;
static PDH_HCOUNTER cpuTotal;

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

double getCurrentValue()
{
    init();
    PDH_FMT_COUNTERVALUE counterVal;

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

int main()
{
    double CPUUsage = getCurrentValue();
}

问题:
getCurrectValue() 返回的值为零。

相关观察:
我观察到 ai 类型 PDH_STATUS 中的值都是零?我推测这可能与我在 CPUUsage 中缺少值有关,尽管我不确定为什么该函数不能正确返回这些值。

附加信息:
我没用过PDH

而是 PdhAddCoutner() is language dependent. You should use PdhAddEnglishCounter()

编辑: 你应该在 [=12] 中的查询 运行 之间有一个最小延迟(500 毫秒) =] 和 getvalue() 中的查询。

补充说明:

运行你的代码在我的windows8.1系统上,结果在init()中,返回的状态iPDH_CSTATUS_NO_OBJECT,也就是说它没有找到对象 "Processor(_Total)"。

我一开始以为打错了,然后在Technet上验证了对象的名称和计数器。

出于好奇,我 运行 最初的 windows 命令 perfmon.exe 并注意到所有对象和计数器都是用我的母语 运行 指定的。 运行 您使用计数器本地语言名称的代码给了我正确的结果。

关于时序约束

语言问题解决后,逐步调试我得到了有意义的 CPU 用法值。但是一旦我删除了断点,我得到的不是 0 就是 100。

因此,我在这个问题上进行了更深入的研究,以在 microsoft support 上发现 % rates 需要在两个连续查询之间有一些最小的延迟。在 init 退出时添加 Sleep(1000) 后,我再次获得有意义的 CPU 使用值。

/* Needed windows definitions by following header */
#include <windef.h>
/* Windows performance data helper */
#include <Pdh.h>

/* Storage of PDH query and associated cpu counter */
struct cpu_counter{
    PDH_HQUERY query;
    PDH_HCOUNTER counter;
};

/* Initialize query & counter */
int cpu_counter_init(struct cpu_counter* pcc)
{
    if(PdhOpenQueryA(NULL, 0, &pcc->query) != ERROR_SUCCESS)
        return -1;
    if(PdhAddEnglishCounterA(pcc->query, "\Processor(_Total)\% Processor Time", 0, &pcc->counter) != ERROR_SUCCESS || PdhCollectQueryData(pcc->query) != ERROR_SUCCESS)
    {
        PdhCloseQuery(pcc->query);
        return -2;
    }
    return 0;
}

/* Fetch data from query and evaluate current counter value */
int cpu_counter_get(struct cpu_counter* pcc)
{
    PDH_FMT_COUNTERVALUE counter_val;
    if(PdhCollectQueryData(pcc->query) != ERROR_SUCCESS || PdhGetFormattedCounterValue(pcc->counter, PDH_FMT_LONG, NULL, &counter_val) != ERROR_SUCCESS)
        return -1;
    return counter_val.longValue;
}

/* Close all counters of query and query itself at the end */
void cpu_counter_close(struct cpu_counter* pcc)
{
    if(pcc->query != NULL)
    {
        PdhCloseQuery(pcc->query);
        pcc->query = NULL;
    }
}

没有丑陋的静态,状态检查,使用实例而不是全局,最小的包含,即使没有 unicode 定义也可以保存,Christophe 的解决方案(请赞成他而不是我) -in.