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 |
---|---|
|
O identificador de consulta não é válido. |
|
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 |