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()
返回的值为零。
相关观察:
我观察到 a
和 i
类型 PDH_STATUS
中的值都是零?我推测这可能与我在 CPUUsage
中缺少值有关,尽管我不确定为什么该函数不能正确返回这些值。
附加信息:
我没用过PDH
而是 PdhAddCoutner()
is language dependent. You should use PdhAddEnglishCounter()
。
编辑: 你应该在 [=12] 中的查询 运行 之间有一个最小延迟(500 毫秒) =] 和 getvalue()
中的查询。
补充说明:
运行你的代码在我的windows8.1系统上,结果在init()
中,返回的状态i
是PDH_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.
现状:
我想尝试测量我的系统当前 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
和 i
类型 PDH_STATUS
中的值都是零?我推测这可能与我在 CPUUsage
中缺少值有关,尽管我不确定为什么该函数不能正确返回这些值。
附加信息:
我没用过PDH
而是 PdhAddCoutner()
is language dependent. You should use PdhAddEnglishCounter()
。
编辑: 你应该在 [=12] 中的查询 运行 之间有一个最小延迟(500 毫秒) =] 和 getvalue()
中的查询。
补充说明:
运行你的代码在我的windows8.1系统上,结果在init()
中,返回的状态i
是PDH_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.