2013-11-06 2 views
0

Пожалуйста, посмотрите на код ниже (взятый из here):Использование функций PDH получить несколько счетчиков производительности

#include <windows.h> 
#include <stdio.h> 
#include <pdh.h> 
#include <pdhmsg.h> 

#pragma comment(lib, "pdh.lib") 

CONST PWSTR COUNTER_PATH = L"\\Processor(0)\\% Processor Time"; 
CONST ULONG SAMPLE_INTERVAL_MS = 1000; 

void DisplayCommandLineHelp(void) 
{ 
    wprintf(L"The command line must include a valid log file name.\n"); 
} 

void wmain(int argc, WCHAR **argv) 
{ 
    HQUERY hQuery = NULL; 
    HLOG hLog = NULL; 
    PDH_STATUS pdhStatus; 
    DWORD dwLogType = PDH_LOG_TYPE_CSV; 
    HCOUNTER hCounter; 
    DWORD dwCount; 

    if (argc != 2) 
    { 
     DisplayCommandLineHelp(); 
     goto cleanup; 
    } 

    // Open a query object. 
    pdhStatus = PdhOpenQuery(NULL, 0, &hQuery); 

    if (pdhStatus != ERROR_SUCCESS) 
    { 
     wprintf(L"PdhOpenQuery failed with 0x%x\n", pdhStatus); 
     goto cleanup; 
    } 

    // Add one counter that will provide the data. 
    pdhStatus = PdhAddCounter(hQuery, 
     COUNTER_PATH, 
     0, 
     &hCounter); 

    if (pdhStatus != ERROR_SUCCESS) 
    { 
     wprintf(L"PdhAddCounter failed with 0x%x\n", pdhStatus); 
     goto cleanup; 
    } 

    // Open the log file for write access. 
    pdhStatus = PdhOpenLog(argv[1], 
     PDH_LOG_WRITE_ACCESS | PDH_LOG_CREATE_ALWAYS, 
     &dwLogType, 
     hQuery, 
     0, 
     NULL, 
     &hLog); 

    if (pdhStatus != ERROR_SUCCESS) 
    { 
     wprintf(L"PdhOpenLog failed with 0x%x\n", pdhStatus); 
     goto cleanup; 
    } 

    // Write 10 records to the log file. 
    for (dwCount = 0; dwCount < 10; dwCount++) 
    { 
     wprintf(L"Writing record %d\n", dwCount); 

     pdhStatus = PdhUpdateLog (hLog, NULL); 
     if (ERROR_SUCCESS != pdhStatus) 
     { 
      wprintf(L"PdhUpdateLog failed with 0x%x\n", pdhStatus); 
      goto cleanup; 
     } 

     // Wait one second between samples for a counter update. 
     Sleep(SAMPLE_INTERVAL_MS); 
    } 

cleanup: 

    // Close the log file. 
    if (hLog) 
     PdhCloseLog (hLog, 0); 

    // Close the query object. 
    if (hQuery) 
     PdhCloseQuery (hQuery); 
} 

Как добавить счетчики для сбора данных, скажем, 10 счетчиков?

Если бы я сделать это таким образом,

CONST PWSTR COUNTER_PATH = L"\\Processor(0)\\% Processor Time"; 
CONST PWSTR COUNTER_PATH1 = L"\\Processor\\% Processor Time"; 

HQUERY hQuery = NULL; 
HQUERY hQuery1 = NULL; 

pdhStatus = PdhOpenQuery(NULL, 0, &hQuery); 
pdhStatus1 = PdhOpenQuery(NULL, 0, &hQuery1); 

и т.д. для каждого счетчика. Это будет утомительно, так как мне нужно будет внести изменения во весь код соответственно. Не могли бы вы предложить любой другой выход?

ответ

1

Вы PdhOpenQuery один раз, затем PdhAddCounter столько счетчиков, сколько хотите.

+0

Большое спасибо. Но как я могу получить счетчики динамически. Например, Process (chrome) \ ThreadCount, Processs (explorer) \% User Time. –

+0

'PdhEnumObjectItems' –

+0

Да, я мог бы использовать это для перечисления всего процесса. Затем, каким будет следующий шаг, чтобы добавить эти много счетчиков? Не могли бы вы рассказать. Огромное спасибо. –

Смежные вопросы