Función PdhCollectQueryDataEx (pdh.h)
Usa un subproceso independiente para recopilar el valor de datos sin procesar actual para todos los contadores de la consulta especificada. A continuación, la función señala el evento definido por la aplicación y espera el intervalo de tiempo especificado antes de devolverlo.
Sintaxis
PDH_FUNCTION PdhCollectQueryDataEx(
[in] PDH_HQUERY hQuery,
[in] DWORD dwIntervalTime,
[in] HANDLE hNewDataEvent
);
Parámetros
[in] hQuery
Identificador de la consulta. La consulta identifica los contadores que desea recopilar. La función PdhOpenQuery devuelve este identificador.
[in] dwIntervalTime
Intervalo de tiempo que se va a esperar, en segundos.
[in] hNewDataEvent
Controle el evento que desea que PDH indique después de que expire el intervalo de tiempo. Para crear un objeto de evento, llame a la función CreateEvent .
Valor devuelto
Si la función se ejecuta correctamente, devuelve ERROR_SUCCESS.
Si se produce un error en la función, el valor devuelto es un código de error del sistema o un código de error PDH. A continuación se muestran los valores posibles.
Código devuelto | Descripción |
---|---|
|
El identificador de consulta no es válido. |
|
La consulta no tiene actualmente ningún contador. |
Comentarios
PDH finaliza el subproceso cuando se llama a la función PdhCloseQuery . Si llama a PdhCollectQueryDataEx más de una vez, cada llamada posterior finaliza el subproceso de la llamada anterior y, a continuación, inicia un nuevo subproceso.
Cuando se llama a PdhCollectQueryDataEx solo para los datos de una instancia de contador y la instancia de contador no existe, la función devuelve PDH_NO_DATA. Sin embargo, si se consultan datos de más de un contador, PdhCollectQueryDataEx puede devolver ERROR_SUCCESS incluso si aún no existe una de las instancias de contador. Esto se debe a que no se sabe si la instancia de contador especificada no existe, o si existirá, pero aún no se ha creado. En este caso, llame a PdhGetRawCounterValue o PdhGetFormattedCounterValue para cada una de las instancias de contador de interés para determinar si existen.
PDH almacena los valores de contador sin procesar de la colección actual y anterior. Si desea recuperar el valor del contador sin procesar actual, llame a la función PdhGetRawCounterValue . Si desea calcular un valor que se puede mostrar para el valor del contador, llame a PdhGetFormattedCounterValue. Si la ruta de acceso del contador contiene un carácter comodín para el nombre de instancia, llame a las funciones PdhGetRawCounterArray y PdhGetFormattedCounterArray , respectivamente.
Ejemplos
En el ejemplo siguiente se muestra cómo usar esta función.
#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 | Value |
---|---|
Cliente mínimo compatible | Windows XP [solo aplicaciones de escritorio] |
Servidor mínimo compatible | Windows Server 2003 [solo aplicaciones de escritorio] |
Plataforma de destino | Windows |
Encabezado | pdh.h |
Library | Pdh.lib |
Archivo DLL | Pdh.dll |