性能监视器以实时或查看历史数据的方式显示了内置的 Windows 性能计数器。可以通过拖放或创建自定义数据收集器集将性能计数器添加到性能监视器。其特征在于可以直观地查看性能日志数据的多个图表视图。可以在性能监视器中创建自定义视图,该视图可以导出为数据收集器集以便与性能和日志记录功能一起使用。


 本文介绍通过API,读取性能监视器中的数据。

一、API介绍:
1、PdhOpenQuery:获取性能监视器数据查询句柄;
2、PdhAddCounter:添加计数器;
3、PdhCollectQueryData:查询性能监视器数据;
4、PdhGetFormattedCounterValue:获取指定计数器数值;

二、实例代码:
1、pdh头文件,在SDK中:
#include <Pdh.h>

2、导入lib:
pdh.lib

3、代码:

void CTestDlg::TestPDH()
{
 CString strInfo = "系统性能:\r\n";
 CString strTemp = "";

HQUERY  hQuery;
 HCOUNTER hcCommitTotal, hcCommitLimit;
 HCOUNTER hcKernelPaged, hcKernelNonpaged;
 HCOUNTER hcSysHandleCount, hcProcesses, hcThreads;

PDH_STATUS lStatus = PdhOpenQuery(NULL, NULL, &hQuery);

if (lStatus != ERROR_SUCCESS)
 {
  return;
 }

PdhAddCounter(hQuery, _T("\\Memory\\Committed Bytes"), NULL, &hcCommitTotal);
 PdhAddCounter(hQuery, _T("\\Memory\\Commit Limit"), NULL, &hcCommitLimit);

PdhAddCounter(hQuery, _T("\\Memory\\Pool Paged Bytes"), NULL, &hcKernelPaged);
 PdhAddCounter(hQuery, _T("\\Memory\\Pool Nonpaged Bytes"), NULL, &hcKernelNonpaged);

PdhAddCounter(hQuery, _T("\\Process(_Total)\\Handle Count"), NULL, &hcSysHandleCount);

PdhAddCounter(hQuery, _T("\\System\\Processes"), NULL, &hcProcesses);
 PdhAddCounter(hQuery, _T("\\System\\Threads"), NULL, &hcThreads);

HCOUNTER hcCPU = NULL;
 HCOUNTER hcThreadCount = NULL;
 HCOUNTER hcHandleCount = NULL;
 HCOUNTER hcWorkingSet = NULL;
 HCOUNTER hcWorkingSetPeak = NULL;
 HCOUNTER hcPageFileBytes = NULL;
 PDH_COUNTER_PATH_ELEMENTS elements;
 char szBuf[1024] = "";
 DWORD dwBufSize = 0;
 char szInstanceName[256] = "360se";

elements.szMachineName = NULL;
 elements.szObjectName = "Process";
 elements.szInstanceName = szInstanceName;
 elements.szParentInstance = NULL;
 elements.dwInstanceIndex = -1;

elements.szCounterName = const_cast<char *>("% Processor Time");
 dwBufSize = sizeof(szBuf);
 PdhMakeCounterPath(&elements, szBuf, &dwBufSize, 0);
 lStatus = PdhAddCounter(hQuery, szBuf, NULL, &hcCPU);
 if (lStatus != ERROR_SUCCESS)
 {
  return;
 }

elements.szCounterName = const_cast<char *>("Thread Count");
 dwBufSize = sizeof(szBuf);
 PdhMakeCounterPath(&elements, szBuf, &dwBufSize, 0);
 lStatus = PdhAddCounter(hQuery, szBuf, NULL, &hcThreadCount);
 if (lStatus != ERROR_SUCCESS)
 {
  return;
 }

elements.szCounterName = const_cast<char *>("Handle Count");
 dwBufSize = sizeof(szBuf);
 PdhMakeCounterPath(&elements, szBuf, &dwBufSize, 0);
 lStatus = PdhAddCounter(hQuery, szBuf, NULL, &hcHandleCount);
 if (lStatus != ERROR_SUCCESS)
 {
  return;
 }

elements.szCounterName = const_cast<char *>("Working set");
 dwBufSize = sizeof(szBuf);
 PdhMakeCounterPath(&elements, szBuf, &dwBufSize, 0);
 lStatus = PdhAddCounter(hQuery, szBuf, NULL, &hcWorkingSet);
 if (lStatus != ERROR_SUCCESS)
 {
  return;
 }

elements.szCounterName = const_cast<char *>("Working set Peak");
 dwBufSize = sizeof(szBuf);
 PdhMakeCounterPath(&elements, szBuf, &dwBufSize, 0);
 lStatus = PdhAddCounter(hQuery, szBuf, NULL, &hcWorkingSetPeak);
 if (lStatus != ERROR_SUCCESS)
 {
  return;
 }

elements.szCounterName = const_cast<char *>("Page File Bytes");
 dwBufSize = sizeof(szBuf);
 PdhMakeCounterPath(&elements, szBuf, &dwBufSize, 0);
 lStatus = PdhAddCounter(hQuery, szBuf, NULL, &hcPageFileBytes);
 if (lStatus != ERROR_SUCCESS)
 {
  return;
 }

PDH_FMT_COUNTERVALUE cv;

lStatus = PdhCollectQueryData(hQuery);
 if (lStatus != ERROR_SUCCESS)
 {
  return;
 }

// CPU时间,必须等待一下
 Sleep(100);

lStatus = PdhCollectQueryData(hQuery);
 if (lStatus != ERROR_SUCCESS)
 {
  return;
 }

// 句柄总数
 lStatus = PdhGetFormattedCounterValue(hcSysHandleCount, PDH_FMT_LONG, NULL, &cv);
 if (lStatus == ERROR_SUCCESS)
 {
  strTemp.Format("句柄总数 : %u\r\n", cv.longValue);
  strInfo += strTemp;
 }
 // 线程总数
 lStatus = PdhGetFormattedCounterValue(hcThreads, PDH_FMT_LONG, NULL, &cv);
 if (lStatus == ERROR_SUCCESS)
 {
  strTemp.Format("线程总数 : %u\r\n", cv.longValue);
  strInfo += strTemp;
 }
 // 进程总数
 lStatus = PdhGetFormattedCounterValue(hcProcesses, PDH_FMT_LONG, NULL, &cv);
 if (lStatus == ERROR_SUCCESS)
 {
  strTemp.Format("进程总数 : %u\r\n", cv.longValue);
  strInfo += strTemp;
 }
 // 核心内存:分页数
 lStatus = PdhGetFormattedCounterValue(hcKernelPaged, PDH_FMT_LARGE, NULL, &cv);
 if (lStatus == ERROR_SUCCESS)
 {
  strTemp.Format("核心内存:分页数 : %u\r\n", cv.largeValue / 1024);
  strInfo += strTemp;
 }
 // 核心内存:未分页数
 lStatus = PdhGetFormattedCounterValue(hcKernelNonpaged, PDH_FMT_LARGE, NULL, &cv);
 if (lStatus == ERROR_SUCCESS)
 {
  strTemp.Format("核心内存:未分页数 : %u\r\n", cv.largeValue / 1024);
  strInfo += strTemp;
 }
 // 认可用量:总数
 lStatus = PdhGetFormattedCounterValue(hcCommitTotal, PDH_FMT_LARGE, NULL, &cv);
 if (lStatus == ERROR_SUCCESS)
 {
  strTemp.Format("认可用量:总数 : %u\r\n", cv.largeValue / 1024);
  strInfo += strTemp;
 }
 // 认可用量:限制
 lStatus = PdhGetFormattedCounterValue(hcCommitLimit, PDH_FMT_LARGE, NULL, &cv);
 if (lStatus == ERROR_SUCCESS)
 {
  strTemp.Format("认可用量:限制 : %u\r\n", cv.largeValue / 1024);
  strInfo += strTemp;
 }

// 以下360rp进程信息
 strInfo += "\r\n";
 strInfo += szInstanceName;
 strInfo += "进程:\r\n";
 // CPU时间,注意必须加上PDH_FMT_NOCAP100参数,否则多核CPU会有问题,详见MSDN
 lStatus = PdhGetFormattedCounterValue(hcCPU, PDH_FMT_DOUBLE | PDH_FMT_NOCAP100, NULL, &cv);
 if (lStatus == ERROR_SUCCESS)
 {
  strTemp.Format("CPU : %f\r\n", cv.doubleValue / 2);
  strInfo += strTemp;
 }
 // 线程数
 lStatus = PdhGetFormattedCounterValue(hcThreadCount, PDH_FMT_LONG, NULL, &cv);
 if (lStatus == ERROR_SUCCESS)
 {
  strTemp.Format("线程数 : %u\r\n", cv.longValue);
  strInfo += strTemp;
 }
 // 句柄数
 lStatus = PdhGetFormattedCounterValue(hcHandleCount, PDH_FMT_LONG, NULL, &cv);
 if (lStatus == ERROR_SUCCESS)
 {
  strTemp.Format("句柄数 : %u\r\n", cv.longValue);
  strInfo += strTemp;
 }
 // 内存使用
 lStatus = PdhGetFormattedCounterValue(hcWorkingSet, PDH_FMT_LARGE, NULL, &cv);
 if (lStatus == ERROR_SUCCESS)
 {
  strTemp.Format("内存使用 : %u\r\n", static_cast<LONG>(cv.largeValue / 1024));
  strInfo += strTemp;
 }
 // 高峰内存使用
 lStatus = PdhGetFormattedCounterValue(hcWorkingSetPeak, PDH_FMT_LARGE, NULL, &cv);
 if (lStatus == ERROR_SUCCESS)
 {
  strTemp.Format("高峰内存使用 : %u\r\n", static_cast<LONG>(cv.largeValue / 1024));
  strInfo += strTemp;
 }
 // 虚拟内存大小
 lStatus = PdhGetFormattedCounterValue(hcPageFileBytes, PDH_FMT_LARGE, NULL, &cv);
 if (lStatus == ERROR_SUCCESS)
 {
  strTemp.Format("虚拟内存大小 : %u\r\n", static_cast<LONG>(cv.largeValue / 1024));
  strInfo += strTemp;
 }

m_staticInfo.SetWindowText(strInfo);
 PdhRemoveCounter(hcCommitTotal);
 PdhRemoveCounter(hcCommitLimit);
 PdhRemoveCounter(hcKernelPaged);
 PdhRemoveCounter(hcKernelNonpaged);
 PdhRemoveCounter(hcSysHandleCount);
 PdhRemoveCounter(hcProcesses);
 PdhRemoveCounter(hcThreads);
 PdhRemoveCounter(hcCPU);
 PdhRemoveCounter(hcThreadCount);
 PdhRemoveCounter(hcHandleCount);
 PdhRemoveCounter(hcWorkingSet);
 PdhRemoveCounter(hcWorkingSetPeak);
 PdhRemoveCounter(hcPageFileBytes);
 PdhCloseQuery(hQuery);
}

4、运行结果截图:

原文链接:https://blog.csdn.net/sqcfj/article/details/7307148

Windows 性能监视器API相关推荐

  1. windows性能监视器API .

    感谢博主http://blog.csdn.net/cosmoslife/article/details/8225845 性能监视器以实时或查看历史数据的方式显示了内置的 Windows 性能计数器.可 ...

  2. Windows 性能监视器perfmon是干嘛的?一篇文章了解性能监视器基本使用

    Windows 性能监视器perfmon是干嘛的?一篇文章了解性能监视器基本使用 在PerfMon中使用性能计数器 有价值的调试计数器 重要的CPU计数器 内存的重要计数器 ASP.NET重要计数器 ...

  3. 自定义Windows性能监视器

    Windows 性能监视器是一个很好用的自带监视工具,对于一些基本简单的监视需求可以轻松满足.本文主要总结了一下如何将自己应用中的一些性能数据暴露到性能监视器上方便管理. 什么?不知道什么是Windo ...

  4. [原创]性能测试之“Windows性能监视器”

    [原创]性能测试之"Windows性能监视器" 一 Windows性能监视器 以下用Winxp中的"Windows性能监视器"为例说明: 打开控制面板-> ...

  5. (转)Windows 性能监视器工具-perfmon

    Windows 性能监视器工具 如果需要在一台计算机上监视多个 Report Server 实例,可以同时或单独监视这些实例.选择要包括的实例是计数器添加过程的一部分.有关使用 Windows 附带的 ...

  6. [转]Windows 性能监视器工具-perfmon

    2019独角兽企业重金招聘Python工程师标准>>> Windows 性能监视器工具 如果需要在一台计算机上监视多个 Report Server 实例,可以同时或单独监视这些实例. ...

  7. Windows 性能监视器的基本指标说明(CPU,内存,硬盘参数)

    作为一个系统工程师来说,要看懂监控的数据至关重要,关系着优化和分析出现的问题.我是在运维过程中要用到的.因此,今天给出Windows 性能监视器的一些基本指标(CPU,内存,硬盘参数),希望对大家将来 ...

  8. 简要Windows性能监视器

    简要Windows性能监视器: 打开Windows性能监视器的步骤如下: 开始→运行→perfmon→确定 在这里我们可以选择添加我们要监控的计数器,比如:cpu使用率.内存使用量等,作为asp.ne ...

  9. 服务器性能数据收集,使用 Windows 性能监视器收集数据

    若要监视资源使用量和服务器进程,您可以使用 Windows 服务器附带的 Windows 性能监视器 (PerfMon).使用 PerfMon 来收集详细性能信息,包括 CPU 的使用频率.使用的内存 ...

  10. 在C/C++代码中使用windows性能监视器

    <编程之美>中的"让CPU占用率曲线听你指挥"一题,作者给出的解法3非常清晰简洁.其思想就是直接查询当前CPU占用率,若过高则Sleep一段时间,否则一直循环.代码使用 ...

最新文章

  1. 使用 markdown-it 解析 markdown 代码(读 VuePress 三)
  2. 计算机里的dump是什么意思?(转储、转储文件)
  3. 转载:【OpenCV入门教程之五】 分离颜色通道多通道图像混合
  4. MyBatis(4)动态SQL
  5. iOS - AsyncSocket 的使用
  6. 五一重装WinXP操作系统所遇问题的解决
  7. apache fop_Apache FOP与Eclipse和OSGi的集成
  8. jmeter负载测试测试_Apache JMeter:随心所欲进行负载测试
  9. 新手上路之django项目开发(二)-----引入静态文件
  10. java 集合modcount_源码|jdk源码之LinkedList与modCount字段
  11. java mysql结果集_Java JDBC结果集的处理
  12. 结对项目——数独扩展
  13. 聊聊职场中的学历问题
  14. 第17课:郭盛华课程_VB编程之菜单界面的设计
  15. Eclipse语言包的安装与卸载
  16. -[UIKBBlurredKeyView candidateList]:手写输入法APP闪退
  17. 教学演示软件 模型十二 地理学的水循环模型
  18. 查看Python版本和位数
  19. 海淀朝阳房山二手房价格反弹明显 短期内仍将持续
  20. 图像深度:8bit、16bit、24bit、32bit; 16.7M色彩

热门文章

  1. 企业的五种组织架构模式
  2. 牛客补题 树 dsu on tree
  3. 背景图片渲染时有色块怎么办
  4. 破解计算机win7管理员密码,教你win7旗舰版怎么破密码
  5. Unity3D 快捷键技巧
  6. 用Python简单的实现AM调制信号波形的变化
  7. mysql中dint,请教一下Dint和Real型变量在使用过程中出现的问题
  8. 服务器server2012重置开机密码
  9. Warbler, A Little Birdie To Introduce Your Rails App To Java
  10. php怎么处理背景虚化,图片虚化处理 照片制作成视频|图片背景虚化后制作成视频并添加音乐...