感谢博主http://blog.csdn.net/cosmoslife/article/details/8225845

性能监视器以实时或查看历史数据的方式显示了内置的 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、运行结果截图:

windows性能监视器API .相关推荐

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

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

  2. 自定义Windows性能监视器

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

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

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

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

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

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

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

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

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

  7. 简要Windows性能监视器

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

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

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

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

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

最新文章

  1. 怎么提高单片机编程水平?
  2. 我为什么要做游戏化教养项目
  3. hdu3786 找出直系亲属 水题
  4. WinCE Heartbeat Message的实现
  5. Linux Kernel中gicv3实现:SPIs中断routing到指定的CPU
  6. if the price goes high
  7. ucontext族函数的使用及原理分析
  8. 计算机组装没步的组件,计算机组装教案.doc
  9. code iban 是有什么组成_深入浅出Zookeeper(四):客户端的请求在服务器中经历了什么...
  10. javascript中的字符串编码、字符串方法详解
  11. rancher中添加用户,赋予权限
  12. MySQL CASE WHEN 根据一个表的字段值不同关联查询两张不同的表【子查询】
  13. Asp.Net Repeater控件绑定泛型ListT的用法
  14. nodejs 任务调度bull 测试解析
  15. 任务调度的合理性 (25 分)(拓扑排序)
  16. Linux 系统设置图形界面启动和黑窗口启动
  17. pacman使用教程,官方文档中文版
  18. AMR文件结构解析——时长解析
  19. 几款好用证件照制作工具推荐
  20. 名侦探柯南之零的执行人

热门文章

  1. docker文件编辑
  2. 开发三星GALAXY Tab应用程序
  3. K8S taint(污点)和tolerations(污点容忍)
  4. 谁痛苦谁改变 落到谷底时,唯一的出口就是向上
  5. 什么是大小端?如何确定大小端?
  6. Elasticsearch 7.3.0 翻译 - 《Aggregations》 度量聚合 百分位数聚合
  7. Cocos2d-x 2.0 之 Actions “三板斧” 之三
  8. 前端面试题杂烩part1
  9. faile什么意思_faile to是什么意思
  10. centos 6.7 mysql密码忘记_CentOS 7安装MySQL5.7以及忘记root密码怎么办