2012-06-08 43 views
1

我可以得到一個C++代碼來讀取Windows perfmon計數器(類別,計數器名稱和實例名稱)嗎?如何閱讀Windows perfmon計數器?

在c#中很容易,但我需要C++代碼。

謝謝

+0

看看我的朋友的博客文章。我們使用這些代碼來製作一些內部工具。 http://askldjd.wordpress.com/2011/01/05/a-pdh-helper-class-cpdhquery/ –

+0

謝謝,但我正在尋找只讀一個計數器值的代碼。我不想用通配符進行查詢。 例如,我需要讀取以下計數器 \\ Processor Information(_Total)\%Processor Time – RedFox

回答

4

正如Doug T.在前面指出的,我之前發佈了一個幫助類來查詢性能計數器的值。該類的用法非常簡單,您只需爲性能計數器提供字符串即可。 http://askldjd.wordpress.com/2011/01/05/a-pdh-helper-class-cpdhquery/

但是,我在我的博客上發佈的代碼在實踐中進行了修改。從您的評論看來,您似乎只想查詢一個字段。

在這種情況下,請嘗試將以下函數添加到我的CPdhQuery類。

double CPdhQuery::CollectSingleData() 
{ 
    double data = 0; 
    while(true) 
    { 
     status = PdhCollectQueryData(hQuery); 

     if (ERROR_SUCCESS != status) 
     { 
      throw CException(GetErrorString(status)); 
     } 

     PDH_FMT_COUNTERVALUE cv; 
     // Format the performance data record. 
     status = PdhGetFormattedCounterValue(hCounter, 
      PDH_FMT_DOUBLE, 
      (LPDWORD)NULL, 
      &cv); 

     if (ERROR_SUCCESS != status) 
     { 
      continue; 
     } 

     data = cv.doubleValue; 

     break; 

    } 

    return data; 
} 

例如, 得到了處理器時間

counter = boost::make_shared<CPdhQuery>(std::tstring(_T("\\Processor Information(_Total)\% Processor Time"))); 

要獲取文件讀取字節/秒:

counter = boost::make_shared<CPdhQuery>(std::tstring(_T("\\System\\File Read Bytes/sec"))); 

要獲取%提交字節:

counter = boost::make_shared<CPdhQuery>(std::tstring(_T("\\Memory\\% Committed Bytes In Use"))); 

要獲得的數據,執行此操作。

double data = counter->CollectSingleData(); 

我希望這有助於。

...艾倫

0

一些常用性能值有API調用來直接獲取它們。例如,總處理器時間可從GetSystemTimes獲得,您可以自己計算百分比。

如果這不是一個選項,那麼Performance Data Helper庫提供了一個適中的簡單的性能數據接口。