首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC++

VC++ 使用 PDH 性能計數器監控系統指標:從入門到枚舉

     編輯:VC++

PDH 簡介

PDH (Performance Data Helper) 封裝了 Windows 性能注冊表數據庫,提供簡潔 API 讀取數百種系統計數器(CPU、內存、磁盤、網絡、進程等),支援實時查詢與日志文件回放。

基礎查詢流程:獲取 QQ 進程 CPU 佔用率

  1. 打開查詢:PdhOpenQuery(NULL, 0, &hQuery)
  2. 添加計數器:PdhAddCounter(hQuery, _T("\\Process(QQ)\\% Processor Time"), 0, &hCounter)
  3. 收集數據:PdhCollectQueryData(hQuery)(需兩次調用間隔計算速率)
  4. 獲取格式化值:PdhGetFormattedCounterValue(hCounter, PDH_FMT_DOUBLE, &dwType, &fmtValue),fmtValue.doubleValue 即為當前 CPU%。
  5. 關閉查詢:PdhCloseQuery(hQuery)
// 關鍵點:首次收集建立基線,Sleep 後再次收集才有速率值
PdhCollectQueryData(hQuery);
Sleep(1000);
PdhCollectQueryData(hQuery);
PdhGetFormattedCounterValue(hCounter, PDH_FMT_DOUBLE, &dwType, &fmtValue);
// fmtValue.doubleValue 即為實時 CPU%

計數器路徑格式

\\Object(Instance)\\Counter 三部分組成:

  • 對象:如 Process, Processor, Memory, PhysicalDisk。
  • 實例:對象的具體實體,如進程名 QQ、磁盤 0 C: D:。無實例對象 (如 System) 省略括號。
  • 計數器:具體指標,如 % Processor Time, Working Set, Disk Read Bytes/sec。

例:\\Process(QQ)\\% Processor Time、\\System\\System Up Time。

動態枚舉所有計數器/實例

避免硬編碼路徑,運行時發現可用指標:

  1. 枚舉對象:PdhEnumObjects(NULL, NULL, szBuf, &dwSize, PERF_DETAIL_WIZARD, TRUE) 獲取所有對象名列表 (雙\0結尾)。
  2. 枚舉計數器與實例:對每個對象調用 PdhEnumObjectItems(NULL, NULL, objName, counterBuf, &cSize, instBuf, &iSize, PERF_DETAIL_WIZARD, 0) 獲取該對象下的所有計數器與實例名。

獲取計數器中文說明

調用 PdhGetCounterInfo(hCounter, TRUE, &dwSize, pInfo),結構 PDH_COUNTER_INFO 中 szExplainText 字段包含本地化說明(如「處理器執行非閒置線程的時間百分比」)。

編譯環境與注意事項

  • 需鏈接 Pdh.lib,包含 <Pdh.h>。
  • 建議使用 Unicode 編譯 (_UNICODE, UNICODE),字符串用 _T() / TEXT() 宏。
  • __try/__finally 為結構化異常處理 (SEH),非必需可改用 try/catch。
  • 僅支援 Windows 2000/XP/2003/Vista/7/10/11 等 NT 內核系統;9x 無性能計數器。
  • 遠程查詢需目標機開啟遠程註冊表服務、防火牆放行、具備管理員權限。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved