C/C++获取Windows平台CPU占用率的方法
作者:CBDDL差不多得了
最近在做系统信息相关的接口,为了实现跨平台,故在linux和Windows平台获取占用率信息,文章主要介绍Windows下的方法,文中给出了参考代码,需要的朋友可以参考下
一、主要接口
PdhOpenQueryA函数
此函数主要作用是:创建从实时源或日志文件收集性能数据的新查询,返回在后续 PDH 函数调用中使用的查询的句柄。
PdhAddCounterA函数
此函数主要功能为:将指定的计数器添加到查询。
PdhCollectQueryData函数
此函数主要功能为:收集指定查询中所有计数器的当前原始数据值,并更新每个计数器的状态代码。 有的数据需要两个样本数据,所以一般步骤为:
- 调用 PdhCollectQueryData 以收集第一个样本。
- 调用 Sleep 函数以在集合之间至少等待一秒。
- 再次调用 PdhCollectQueryData 以收集第二个样本。
- 调用 PdhGetFormattedCounterValue 函数以计算可显示的值。
- 重复步骤 2 到 4。
PdhGetFormattedCounterValue函数
此函数主要功能为:计算指定计数器的可显示值。
大体的逻辑是:创建句柄->添加计数器->收集数据->显示数据
以下是参考代码:
#include <pdh.h> #pragma comment(lib, "Pdh.lib") PDH_STATUS status; PDH_HQUERY query; PDH_HCOUNTER counter; status = PdhOpenQueryA(NULL, 0, &query); if (status != ERROR_SUCCESS) { return; } status = PdhAddCounterA(query, "\\Processor(_Total)\\% Idle Time", 0, &counter); if (status != ERROR_SUCCESS) { PdhCloseQuery(query); return; } const int NUM = 10; PdhCollectQueryData(query); PDH_RAW_COUNTER rawValueArray[NUM]; // 假设有00个取样值 for (int i = 0; i < NUM; i++) { Sleep(1000); //阻塞1s PdhCollectQueryData(query); PDH_FMT_COUNTERVALUE value; PdhGetRawCounterValue(counter, 0, &rawValueArray[i]); status = PdhGetFormattedCounterValue(counter, PDH_FMT_DOUBLE, NULL, &value); if (status == ERROR_SUCCESS) { printf("getCpuPercenage: %.2f%\n", value.doubleValue); } else { std::cout << "Error:" << status; } } DWORD dwFirstEntry = 0; // 从第一个取样值开始 DWORD dwNumEntries = NUM; // 一共10个取样值 PDH_STATISTICS stat; // 计算统计信息 status = PdhComputeCounterStatistics(counter, PDH_FMT_DOUBLE, dwFirstEntry, dwNumEntries, rawValueArray, &stat); if (status == ERROR_SUCCESS) { printf("Average: %f\n", stat.mean.doubleValue); printf("Minimum: %f\n", stat.min.doubleValue); printf("Maximum: %f\n", stat.max.doubleValue); } else { printf("Failed to compute counter statistics: %d\n", status); } PdhCloseQuery(query);
附上参考链接:使用 PDH 函数使用计数器数据 - Win32 apps | Microsoft Learn
Ps:以上代码使用的是% Idle Time (处理器在采样期间空闲的时间的百分比),因为我感觉这个比% Processor Time (处理器用来执行非闲置线程时间的百分比)更准确,可以自行用100减掉。
以上就是C/C++获取Windows平台CPU占用率的方法的详细内容,更多关于C/C++获取Windows CPU占用率的资料请关注脚本之家其它相关文章!