Compartilhar via


Função PdhCollectQueryDataEx (pdh.h)

Usa um thread separado para coletar o valor de dados brutos atual para todos os contadores na consulta especificada. Em seguida, a função sinaliza o evento definido pelo aplicativo e aguarda o intervalo de tempo especificado antes de retornar.

Sintaxe

PDH_FUNCTION PdhCollectQueryDataEx(
  [in] PDH_HQUERY hQuery,
  [in] DWORD      dwIntervalTime,
  [in] HANDLE     hNewDataEvent
);

Parâmetros

[in] hQuery

Identificador da consulta. A consulta identifica os contadores que você deseja coletar. A função PdhOpenQuery retorna esse identificador.

[in] dwIntervalTime

Intervalo de tempo a aguardar, em segundos.

[in] hNewDataEvent

Manipule para o evento que você deseja que o PDH sinalize depois que o intervalo de tempo expirar. Para criar um objeto de evento, chame a função CreateEvent .

Retornar valor

Se a função for bem-sucedida, ela retornará ERROR_SUCCESS.

Se a função falhar, o valor retornado será um código de erro do sistema ou um código de erro PDH. Veja a seguir os valores possíveis.

Código de retorno Descrição
PDH_INVALID_HANDLE
O identificador de consulta não é válido.
PDH_NO_DATA
No momento, a consulta não tem contadores.

Comentários

O PDH encerra o thread quando você chama a função PdhCloseQuery . Se você chamar PdhCollectQueryDataEx mais de uma vez, cada chamada subsequente encerrará o thread da chamada anterior e iniciará um novo thread.

Quando PdhCollectQueryDataEx é chamado apenas para dados de uma instância de contador e a instância do contador não existe, a função retorna PDH_NO_DATA. No entanto, se os dados de mais de um contador forem consultados, PdhCollectQueryDataEx poderá retornar ERROR_SUCCESS mesmo que uma das instâncias do contador ainda não exista. Isso ocorre porque não se sabe se a instância de contador especificada não existe ou se ela existirá, mas ainda não foi criada. Nesse caso, chame PdhGetRawCounterValue ou PdhGetFormattedCounterValue para cada uma das instâncias de interesse do contador para determinar se elas existem.

O PDH armazena os valores brutos do contador para a coleção atual e anterior. Se você quiser recuperar o valor do contador bruto atual, chame a função PdhGetRawCounterValue . Se você quiser calcular um valor exibivel para o valor do contador, chame pdhGetFormattedCounterValue. Se o caminho do contador contiver um curinga para o nome da instância, chame as funções PdhGetRawCounterArray e PdhGetFormattedCounterArray , respectivamente.

Exemplos

O exemplo a seguir mostra como usar essa função.


#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);
    }
}

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows XP [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2003 [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho pdh.h
Biblioteca Pdh.lib
DLL Pdh.dll

Confira também

CreateEvent

PdhCollectQueryData

PdhOpenQuery