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);
и т.д. для каждого счетчика. Это будет утомительно, так как мне нужно будет внести изменения во весь код соответственно. Не могли бы вы предложить любой другой выход?
Большое спасибо. Но как я могу получить счетчики динамически. Например, Process (chrome) \ ThreadCount, Processs (explorer) \% User Time. –
'PdhEnumObjectItems' –
Да, я мог бы использовать это для перечисления всего процесса. Затем, каким будет следующий шаг, чтобы добавить эти много счетчиков? Не могли бы вы рассказать. Огромное спасибо. –