现状:
我正试图在赫兹中尝试测量我系统的当前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。
答案 0 :(得分:3)
PdhAddCoutner()
取决于语言。您应该使用 PdhAddEnglishCounter()
。
编辑: 您应该在init()
中运行的查询与getvalue()
中的查询之间有最小延迟(500毫秒)。
补充说明:
在我的Windows 8.1系统上运行代码,结果发现在init()
中,返回的状态i
为PDH_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 解决方案(而不是我的内容)。