Поделиться через


Функция 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_INVALID_HANDLE
Недопустимый дескриптор запроса.
PDH_NO_DATA
В настоящее время у запроса нет счетчиков.

Комментарии

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

См. также раздел

CreateEvent

PdhCollectQueryData

PdhOpenQuery