Функция PdhCollectQueryDataEx (pdh.h)
Использует отдельный поток для сбора текущего значения необработанных данных для всех счетчиков в указанном запросе. Затем функция передает сигнал определенному приложением событию и ожидает указанного интервала времени перед возвратом.
Синтаксис
PDH_FUNCTION PdhCollectQueryDataEx(
[in] PDH_HQUERY hQuery,
[in] DWORD dwIntervalTime,
[in] HANDLE hNewDataEvent
);
Параметры
[in] hQuery
Дескриптор запроса. Запрос определяет счетчики, которые требуется собрать. Функция PdhOpenQuery возвращает этот дескриптор.
[in] dwIntervalTime
Интервал времени ожидания в секундах.
[in] hNewDataEvent
Обработайте событие, которое вы хотите сообщить PDH по истечении интервала времени. Чтобы создать объект события, вызовите функцию CreateEvent .
Возвращаемое значение
Если функция завершается успешно, она возвращает ERROR_SUCCESS.
Если функция завершается сбоем, возвращаемое значение представляет собой код системной ошибки или код ошибки PDH. Ниже приведены возможные значения.
Код возврата | Описание |
---|---|
|
Недопустимый дескриптор запроса. |
|
В настоящее время у запроса нет счетчиков. |
Комментарии
PDH завершает поток при вызове функции PdhCloseQuery . Если вы вызываете PdhCollectQueryDataEx несколько раз, каждый последующий вызов завершает поток из предыдущего вызова, а затем запускает новый поток.
Если pdhCollectQueryDataEx вызывается для данных только из одного экземпляра счетчика, а экземпляр счетчика не существует, функция возвращает PDH_NO_DATA. Однако при запросе данных из нескольких счетчиков PdhCollectQueryDataEx может вернуть ERROR_SUCCESS даже если один из экземпляров счетчика еще не существует. Это связано с тем, что неизвестно, существует ли указанный экземпляр счетчика или он будет существовать, но еще не создан. В этом случае вызовите PdhGetRawCounterValue или PdhGetFormattedCounterValue для каждого интересующего экземпляра счетчика, чтобы определить, существуют ли они.
PDH сохраняет необработанные значения счетчиков для текущей и предыдущей коллекции. Если вы хотите получить текущее необработанное значение счетчика, вызовите функцию PdhGetRawCounterValue . Если вы хотите вычислить отображаемое значение для значения счетчика, вызовите PdhGetFormattedCounterValue. Если путь счетчика содержит подстановочный знак для имени экземпляра, вместо этого вызовите функции PdhGetRawCounterArray и PdhGetFormattedCounterArray соответственно.
Примеры
В следующем примере показано, как использовать эту функцию.
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <pdh.h>
#pragma comment(lib, "pdh.lib")
CONST PWSTR COUNTER_NAME = L"\\Processor(0)\\% Processor Time";
CONST ULONG SAMPLE_COUNT = 10;
CONST ULONG SAMPLE_INTERVAL = 2;
void wmain(void)
{
PDH_STATUS Status;
HANDLE Event = NULL;
PDH_HQUERY Query = NULL;
PDH_HCOUNTER Counter;
ULONG WaitResult;
ULONG CounterType;
PDH_FMT_COUNTERVALUE DisplayValue;
Status = PdhOpenQuery(NULL, 0, &Query);
if (Status != ERROR_SUCCESS)
{
wprintf(L"\nPdhOpenQuery failed with status 0x%x.", Status);
goto Cleanup;
}
Status = PdhAddCounter(Query, COUNTER_NAME, 0, &Counter);
if (Status != ERROR_SUCCESS)
{
wprintf(L"\nPdhAddCounter failed with 0x%x.", Status);
goto Cleanup;
}
//
// Calculating the formatted value of some counters requires access to the
// value of a previous sample. Make this call to get the first sample value
// populated, to be used later for calculating the next sample.
//
Status = PdhCollectQueryData(Query);
if (Status != ERROR_SUCCESS)
{
wprintf(L"\nPdhCollectQueryData failed with status 0x%x.", Status);
goto Cleanup;
}
//
// This will create a separate thread that will collect raw counter data
// every 2 seconds and set the supplied Event.
//
Event = CreateEvent(NULL, FALSE, FALSE, L"MyEvent");
if (Event == NULL)
{
wprintf(L"\nCreateEvent failed with status 0x%x.", GetLastError());
goto Cleanup;
}
Status = PdhCollectQueryDataEx(Query, SAMPLE_INTERVAL, Event);
if (Status != ERROR_SUCCESS)
{
wprintf(L"\nPdhCollectQueryDataEx failed with status 0x%x.", Status);
goto Cleanup;
}
//
// Collect and format 10 samples, 2 seconds apart.
//
for (ULONG i = 0; i < SAMPLE_COUNT; i++)
{
WaitResult = WaitForSingleObject(Event, INFINITE);
if (WaitResult == WAIT_OBJECT_0)
{
Status = PdhGetFormattedCounterValue(Counter, PDH_FMT_DOUBLE, &CounterType, &DisplayValue);
if (Status == ERROR_SUCCESS)
{
wprintf(L"\nCounter Value: %.20g", DisplayValue.doubleValue);
}
else
{
wprintf(L"\nPdhGetFormattedCounterValue failed with status 0x%x.", Status);
goto Cleanup;
}
}
else if (WaitResult == WAIT_FAILED)
{
wprintf(L"\nWaitForSingleObject failed with status 0x%x.", GetLastError());
goto Cleanup;
}
}
Cleanup:
if (Event)
{
CloseHandle(Event);
}
//
// This will close both the Query handle and all associated Counter handles
// returned by PdhAddCounter.
//
if (Query)
{
PdhCloseQuery(Query);
}
}
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows XP [только классические приложения] |
Минимальная версия сервера | Windows Server 2003 [только классические приложения] |
Целевая платформа | Windows |
Header | pdh.h |
Библиотека | Pdh.lib |
DLL | Pdh.dll |