15.2.3 本地监控示例(CPU使用率)
本节中的示例将利用Windows自带的性能计数器,来实时地监测当前计算机的CPU使用率,其实现步骤如下所示。
(1)创建一个VC++(www.cppentry.com)工程选取控制台程序,命名为GetCpuUsage,如图15.1所示。
|
| 图15.1 创建VC++(www.cppentry.com)工程 |
(2)在GetCpuUsage.cpp文件中添加pdh.h头文件,并引用pdh.lib库文件。代码如下:
- #include "pdh.h"
- #pragma comment(lib, "Pdh.lib") //显式连接Pdh.lib
(3)在main()函数中添加如下代码:
- 01 void main(void)
- 02 {
- 03 PDH_STATUS status = ERROR_SUCCESS;
- 04 HQUERY hQuery = NULL; //计数器对象句柄
- 05 HCOUNTER hCounter = NULL; //计数器句柄
- 06 PDH_FMT_COUNTERVALUE DisplayValue; //计数器值
- 07 DWORD dwCounterType = 0; //计数器类型
- 08 status = PdhOpenQuery(NULL, 0, &hQuery); //打开计数器对象
- 09 if (ERROR_SUCCESS == status)
- 10 {
- 11 //PdhAddCounter()函数添加计数器,参数中Processor代表计数器对象,(0)表示 第1个处理器计数实例。如果计算机上有两个处理器,则第2个处理器计数实例用(1) 表示
- 12 //% Processor Time表示计数器(取得处理器占用时间),注意%后面有个空格
- 13 status = PdhAddCounter(hQuery, "\\Processor(0)\\% Processor Time", 0, &hCounter);
- 14 if (ERROR_SUCCESS == status)
- 15 {
- 16 // PdhCollectQueryData()函数收集数据需两次调用, PdhCollectQuery
- DataEx只需一次
- 17 PdhCollectQueryData(hQuery); //首次收集数据
- 18 while(true)
- 19 {
- 20 PdhCollectQueryData(hQuery); //再次收集数据
- 21 status = PdhGetFormattedCounterValue(hCounter,
- 22 PDH_FMT_DOUBLE,
- 23 &dwCounterType, &DisplayValue);
- //取得收集的数据值
- 24 printf("CPU占用 %.2f\n", DisplayValue.doubleva lue);
- 25 Sleep(1000); //1秒收集1次
- 26 }
- 27 }
- 28 PdhCloseQuery(hQuery); //关闭计数器对象
- 29 }
- 30 }
上述代码使用Windows性能计数器获取CPU占用率,功能实现步骤如下。
第4~8行定义并且打开计数器对象。
第13行添加感兴趣的计数器。
第16~20行收集感兴趣的计数器值,注意使用PdhCollectQueryData函数收集数据时要调用两次。
第21~23行取得计数器的值。
第28行关闭计数器对象。
说明:代码中的Sleep(1000)使线程暂停1秒执行,在循环中它相当于定时器。
监测到当前计算机的CPU使用率如图15.2所示。
|
| 图15.2 监测到计算机的CPU使用率 |