Funzione PdhCollectQueryDataEx (pdh.h)
Usa un thread separato per raccogliere il valore di dati non elaborato corrente per tutti i contatori nella query specificata. La funzione segnala quindi l'evento definito dall'applicazione e attende l'intervallo di tempo specificato prima di restituire.
Sintassi
PDH_FUNCTION PdhCollectQueryDataEx(
[in] PDH_HQUERY hQuery,
[in] DWORD dwIntervalTime,
[in] HANDLE hNewDataEvent
);
Parametri
[in] hQuery
Handle della query. La query identifica i contatori che si desidera raccogliere. La funzione PdhOpenQuery restituisce questo handle.
[in] dwIntervalTime
Intervallo di tempo da attendere, in secondi.
[in] hNewDataEvent
Gestire l'evento che si vuole segnalare PDH dopo la scadenza dell'intervallo di tempo. Per creare un oggetto evento, chiamare la funzione CreateEvent .
Valore restituito
Se la funzione ha esito positivo, restituisce ERROR_SUCCESS.
Se la funzione ha esito negativo, il valore restituito è un codice di errore di sistema o un codice di errore PDH. Di seguito sono riportati i valori possibili.
Codice restituito | Descrizione |
---|---|
|
L'handle di query non è valido. |
|
La query non dispone attualmente di contatori. |
Commenti
PDH termina il thread quando si chiama la funzione PdhCloseQuery . Se si chiama PdhCollectQueryDataEx più volte, ogni chiamata successiva termina il thread dalla chiamata precedente e quindi avvia un nuovo thread.
Quando PdhCollectQueryDataEx viene chiamato per i dati da un'istanza di contatore solo e l'istanza del contatore non esiste, la funzione restituisce PDH_NO_DATA. Tuttavia, se i dati di più contatori vengono sottoposti a query, PdhCollectQueryDataEx può restituire ERROR_SUCCESS anche se una delle istanze del contatore non esiste ancora. Ciò avviene perché non è noto se l'istanza del contatore specificata non esiste o se esiste, ma non è ancora stata creata. In questo caso, chiamare PdhGetRawCounterValue o PdhGetFormattedCounterValue per ognuna delle istanze di contatore di interesse per determinare se esistono.
PDH archivia i valori dei contatori non elaborati per la raccolta corrente e precedente. Se si vuole recuperare il valore del contatore non elaborato corrente, chiamare la funzione PdhGetRawCounterValue . Se si vuole calcolare un valore visualizzabile per il valore del contatore, chiamare PdhGetFormattedCounterValue. Se il percorso del contatore contiene un carattere jolly per il nome dell'istanza, chiamare rispettivamente le funzioni PdhGetRawCounterArray e PdhGetFormattedCounterArray .
Esempio
Nell'esempio seguente viene illustrato come usare questa funzione.
#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);
}
}
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows XP [solo app desktop] |
Server minimo supportato | Windows Server 2003 [solo app desktop] |
Piattaforma di destinazione | Windows |
Intestazione | pdh.h |
Libreria | Pdh.lib |
DLL | Pdh.dll |