在C/C++代码中使用windows性能监视器
《编程之美》中的“让CPU占用率曲线听你指挥”一题,作者给出的解法3非常清晰简洁。其思想就是直接查询当前CPU占用率,若过高则Sleep一段时间,否则一直循环。代码使用C#编写。于是自己想将这一思路使用C/C++来实现。
那么首先需要查清楚windows提供了哪些操作性能监视器(perfmon.msc)的API。在网上搜索一下,在vckbase上有一篇文章恰好是讲解这一主题的。这些操作性能监视器的API都以pdh开头。只要知道这一点,就可以在MSDN上查到完整资料。
在MSDN中的索引中输入PDH,列出的第一条主题就是:Platform SDK: Performance Monitoring—Using the PDH Interface.这篇概述文章中描述了PDH可以做什么以及如何使用它们。使用PDH接口操作性能监视器的方法可以概括为以下五个步骤:
1. 创建一个查询(Create a query)。相关的API是PdhOpenQuery。
2. 在已创建的查询中添加一个或多个计数器(Add counters to the query)。相关的API是PdhAddCounter。这个API需要一个描述计数器的字符串参数。MSDN上给出了四种构造符合语法的字符串的方法。其中最容易的方法是使用PdhMakeCounterPath函数。
3. 收集性能数据(collect the performance data)。与此相关的API是PdhCollectQueryData。
4. 处理这此收集到的性能数据(Process the performance data)。与此相关的有数个API。PdhGetFormattedCounterValue这个函数用来获得指定格式的数据。
5. 完成任务后,关闭这个查询(Close the query)。相关的API是PdhCloseQuery。
以上五步中第二步构造描述计数器的字符串有些陌生。它牵扯到一个数据结构,这个数据结构的定义如下:typedef struct _PDH_COUNTER_PATH_ELEMENTS { LPTSTR szMachineName; LPTSTR szObjectName; LPTSTR szInstanceName; LPTSTR szParentInstance; DWORD dwInstanceIndex; LPTSTR szCounterName;} PDH_COUNTER_PATH_ELEMENTS, *PPDH_COUNTER_PATH_ELEMENTS;
如果不知道如何填充这个数据结构,最好的办法就是打开性能监视器(开始——运行——输入“perfmon.msc”),在图表框中右击,选择添加计数器,在弹出的“添加计数器”对话框中,可以通过下柆列表或列表框选择计算机(数据结构的szMachineName项)、性能对象(szObjectName)、选择计数器(与Object对应的szCounterName)、选择范例(szInstanceName)。可以照着填充。
在我的程序中需要获取CPU使用率。所以选择的对象是Processor,计数器是% Processor Time,范例是_Total。完整的程序代码如下:#undef UNICODE#undef _UNICODE#include <windows.h>#include <tchar.h>#include <stdio.h>#include <pdh.h>#pragma comment(lib, "pdh.lib")HQUERY hQuery = NULL;// 处理ctrl-c异常BOOL WINAPI HandlerRoutine( DWORD dwCtrlType // control signal type ) { if(dwCtrlType == CTRL_C_EVENT) { printf("ctrl c exception/n"); if(hQuery) PdhCloseQuery(hQuery); } return false;}int main() { SetConsoleCtrlHandler(HandlerRoutine, TRUE); PDH_STATUS pdhStatus; // open query pdhStatus = PdhOpenQuery(0, 0, &hQuery); if(pdhStatus != ERROR_SUCCESS) { printf("PdhOpenQuery failed/n"); exit(1); } // construct a counter path PDH_COUNTER_PATH_ELEMENTS pcpe; TCHAR szFullPathBuffer[MAX_PATH] = TEXT(""); DWORD dwSize = sizeof(szFullPathBuffer); pcpe.szMachineName = TEXT("WANGHAIBIN"); pcpe.szObjectName = TEXT("Processor"); pcpe.szInstanceName = TEXT("_Total"); pcpe.szCounterName = TEXT("% Processor Time"); pcpe.dwInstanceIndex = -1; pcpe.szParentInstance = NULL; pdhStatus = PdhMakeCounterPath(&pcpe, szFullPathBuffer, &dwSize, 0); if(pdhStatus != ERROR_SUCCESS) { printf("PdhMakeCounterPath failed/n"); goto exit_prog; } _tprintf(TEXT("path: %s/n"), szFullPathBuffer); // add a counter HCOUNTER hCounter; pdhStatus = PdhAddCounter(hQuery, szFullPathBuffer, 0, &hCounter); //pdhStatus = PdhAddCounter(hQuery, TEXT("//Processor(_Total)//% Processor Time"), 0, &hCounter); if(pdhStatus != ERROR_SUCCESS) { printf("PdhAddCounter failed/n"); goto exit_prog; } // collect query data pdhStatus = PdhCollectQueryData(hQuery); //pdhStatus = PdhCollectQueryDataEx(hQuery, 1, NULL); if(pdhStatus != ERROR_SUCCESS) { printf("PdhCollectQueryData failed/n"); goto exit_prog; } // get counter value PDH_FMT_COUNTERVALUE pfc; DWORD dwOpt; pdhStatus = PdhGetFormattedCounterValue( hCounter,PDH_FMT_DOUBLE,&dwOpt,&pfc); while(pdhStatus == ERROR_SUCCESS) { //printf("%lf/n", pfc.doubleValue); pdhStatus = PdhCollectQueryData(hQuery); PdhGetFormattedCounterValue(hCounter, PDH_FMT_DOUBLE, &dwOpt, &pfc); }exit_prog: PdhCloseQuery(hQuery); return 0;}
需要注意的是,上面的% Processor Time中的%和Processor之间有一个空格。不要写错了。
VCKBASE的那篇文章链接:http://www.vckbase.com/document/viewdoc/?id=1434
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
在C/C++代码中使用windows性能监视器相关推荐
- [原创]性能测试之“Windows性能监视器”
[原创]性能测试之"Windows性能监视器" 一 Windows性能监视器 以下用Winxp中的"Windows性能监视器"为例说明: 打开控制面板-> ...
- 自定义Windows性能监视器
Windows 性能监视器是一个很好用的自带监视工具,对于一些基本简单的监视需求可以轻松满足.本文主要总结了一下如何将自己应用中的一些性能数据暴露到性能监视器上方便管理. 什么?不知道什么是Windo ...
- (转)Windows 性能监视器工具-perfmon
Windows 性能监视器工具 如果需要在一台计算机上监视多个 Report Server 实例,可以同时或单独监视这些实例.选择要包括的实例是计数器添加过程的一部分.有关使用 Windows 附带的 ...
- [转]Windows 性能监视器工具-perfmon
2019独角兽企业重金招聘Python工程师标准>>> Windows 性能监视器工具 如果需要在一台计算机上监视多个 Report Server 实例,可以同时或单独监视这些实例. ...
- Windows 性能监视器的基本指标说明(CPU,内存,硬盘参数)
作为一个系统工程师来说,要看懂监控的数据至关重要,关系着优化和分析出现的问题.我是在运维过程中要用到的.因此,今天给出Windows 性能监视器的一些基本指标(CPU,内存,硬盘参数),希望对大家将来 ...
- 简要Windows性能监视器
简要Windows性能监视器: 打开Windows性能监视器的步骤如下: 开始→运行→perfmon→确定 在这里我们可以选择添加我们要监控的计数器,比如:cpu使用率.内存使用量等,作为asp.ne ...
- Windows 性能监视器perfmon是干嘛的?一篇文章了解性能监视器基本使用
Windows 性能监视器perfmon是干嘛的?一篇文章了解性能监视器基本使用 在PerfMon中使用性能计数器 有价值的调试计数器 重要的CPU计数器 内存的重要计数器 ASP.NET重要计数器 ...
- 服务器性能数据收集,使用 Windows 性能监视器收集数据
若要监视资源使用量和服务器进程,您可以使用 Windows 服务器附带的 Windows 性能监视器 (PerfMon).使用 PerfMon 来收集详细性能信息,包括 CPU 的使用频率.使用的内存 ...
- python如何提高性能_python – 如何在这个短代码中提高numpy性能...
我试图了解为什么我的一个python脚本比gfortran慢了约4倍,我必须这样做: import numpy as np nvar_x=40 nvar_y=10 def fn_tst(x): for ...
最新文章
- 深度学习技术在美图个性化推荐的应用实践
- JavaEE进阶知识学习-----SpringCloud(四)Eureka集群配置
- 算法----删除链表中的节点(Java)
- 常用数据库语句(更新)
- .NET部分知识点整理
- 源码安装mysql主从_mysql源码安装和主从同步配置
- 此情应是长相守 你若无心我便休
- 使用 Boost.MPI 的 reduce() 计算最小值的示例
- [Linux] nginx的try_files指令实现隐藏index.php的重写
- 获得三位数的百位,十位和个位
- springboot细节挖掘(jar和war打包)
- C++ MathGL 二维数据绘图
- 利用jszip压缩下载多文件
- 轴承选型选不好,可别再说轴承质量差劲啦!
- ~《概率论》~贝叶斯公式
- c语言中f的作用是什么,c语言中f什么意思 c语言中f什么意思
- golang 环境搭建-windows
- 2021强网杯 ezmath writeup
- AlertManager实现企业微信报警(十三)
- 小程序获取上一个页面或者某个页面内的值
热门文章
- Python 文件类型(*.py/*.pyc/*.pyo)
- 为什么软件开发很难?真相了
- The Preliminary Contest for ICPC China Nanchang National Invitational 南昌网络赛2019
- sql与mysql中2个表数据进行匹配_SQL语言中把数据库中两张表数据关联起来的语句...
- 【python库】:Pillow、PyTorch、Colorama超详细
- PHP**数据类型**
- 算法优化---向量数组计算替代元素级别判断
- 抖音实战~手机号密码一键注册登录流程(限制手机终端登录)
- linux系统python生成so_Python 项目转化为so文件实例
- Linux到底是什么