用Pdh库获得CPU利用率

本文详细介绍了如何利用Pdh库获取Windows系统的CPU利用率。通过PdhOpenQuery、PdhAddCounter、PdhCollectQueryData等函数,配合示例代码,展示了获取并解析性能数据的完整过程。
摘要由CSDN通过智能技术生成

花了三天时间搞清楚了Pdh库中几个函数的具体用法,MSDN上只有解释,没有示例;网上查资料,也没能帮我解决问题,可能由于硬件和操作系统不同,网上提供的代码在我机器上不能运行,具体是哪的错误网上没有查到相关资料。无计可施的时候,一次无聊的尝试,成功了,然后顿悟。现整理如下:

可以用Pdh(performance data helper)库提供的一些函数来获取系统当前的一些性能数据(也可以读取日志文件获取之前的一些性能数据)。下面以以cpu的利用率为例介绍。

头文件: Pdh.h    (用#include<Pdh.h>包含)

静态链接库: Pdh.lib  (可以用宏语句 #pragma comment(lib,"Pdh.lib")来加载)

动态连接库: Pdh.dll (可以在主函数内用语句 HMODULE hModule=LoadLibraryEx("Pdh.dll",NULL,LOAD_LIBRARY_AS_DATAFILE)来加载动态连接库,用FreeLibrary(hModule)语句来释放动态连接库)

用Pdh库获得当前CPU利用率的步骤如下:

1、打开查询(query)句柄。

   HQUERY hquery; //声明查询句柄hquery

   PDHSTATUS pdhstatus=PdhOpenQuery(0,0,&hquery);

2、在查询中加入计数器(counter)(一个query中可以加入好几个counter,本例中之加入了一个counter)

   HCOUNTER* pdhcounter;   //计数器句柄的指针

   pdhcounter=(HCOUNTER*)GlobalAlloc(GPTR,(sizeof(HCOUNTER)));  //为计数器分配存储空间

   PdhAddCounter(hquery,"\\Processor Information(_Total)\\% Processor Time",0,pdhcounter);  //向查询hquery中加入计数器pdhcounter,函数的第二个参数是指定要加入什么样的技术器(就是在这里指定“cpu利用率”计数器),其格式是\\Computer\PerfObject(parent_instance/instance#index)\counter,其中,Computer指定要检测哪台计算机的性能,可以用ip地址指定网络中一台其他的计算机,本机时可以省略;PerfObject指定性能对象,即对哪类对象(可以是处理器(Processor Information),在其他系统中可能还可以是进程Process)进行检查,instance指定这类对象中的一个实例(如多个cpu时指定是哪个cpu(或者他们的和Total),对象是Process是可以指定是哪个进程等等),parent_instance和#index(index是数字,表示第几个instance)都是在只用instance无法识别是哪个进程时,需要加入的项(instance独一无二时,他们可以省略),counter指定前面指定的对象上的某个计数器(如Processor Information对象上有% Processor Time计数器,% Processor Time是一个整体,% 是计数器名字的一部分,要谨记的是%和P之间有一个空格,少写这个空格将找不到计数器)

    用GlobalAlloc()为pdhcounter分配的存储空间,当pdhcounter不再使用的时候,要用GlobalFree(pdhcounter)函数将其释放。

3、收集query的数据(query中的所有counter的数据都会被收集)

   PdhCollectQueryData(hquery);  //特别需要注意的是,用些counter数据(如rate、% Processor Time)需要Collect两次才能得到,有人遇到获取的cpu利用率总是0这个问题,那是因为虽然你用了两个PdhCollectQueryData()两次(否则会出错),但这两条相同的语句是紧挨着的,Pdh函数会计算这两个PdhCollectQueryData()之间这段时间的cpu利用率,所以将如两条语句紧挨着,那么这个间隔时间太短,所

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值