C ++ - 以赫兹(Windows)查找当前的CPU使用情况

时间:2015-07-25 12:10:06

标签: c++ winapi cpu-usage pdh

现状:
我正试图在赫兹中尝试测量我系统的当前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()返回的值为零。

相关观察:
我观察到,类型a的{​​{1}}和i中的值都是零?我推测这可能与PDH_STATUS中缺少值有关,虽然我不确定为什么函数不会正确地返回到这些值。

其他信息:
我之前没有使用过PDH。

2 个答案:

答案 0 :(得分:3)

PdhAddCoutner() 取决于语言。您应该使用 PdhAddEnglishCounter()

编辑: 您应该在init()中运行的查询与getvalue()中的查询之间有最小延迟(500毫秒)。

补充说明:

在我的Windows 8.1系统上运行代码,结果发现在init()中,返回的状态iPDH_CSTATUS_NO_OBJECT,这意味着它找不到对象“处理器(_总)”。

我首先想到有一个拼写错误,并在Technet上验证了对象的名称和计数器。

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

关于时间限制

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

所以我在这个问题上进一步挖掘,以找出microsoft support%率需要两次连续查询之间的一些最小延迟。一旦我在init的退出处添加Sleep(1000),我再次获得了有意义的CPU使用率值。

答案 1 :(得分:0)

case "$1" in
  -u|--update)
      echo update
      ;;
  *)
      echo no update
      ;;
esac

没有丑陋的静态,状态检查,使用实例而不是全局,最小包括,即使没有unicode定义也能保存,内置的 Christophe 解决方案(而不是我的内容)。