PdhCollectQueryDataEx-Funktion (pdh.h)

Verwendet einen separaten Thread, um den aktuellen Rohdatenwert für alle Leistungsindikatoren in der angegebenen Abfrage zu sammeln. Die Funktion signalisiert dann das anwendungsdefinierte Ereignis und wartet das angegebene Zeitintervall, bevor sie zurückgegeben wird.

Syntax

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

Parameter

[in] hQuery

Handle der Abfrage. Die Abfrage identifiziert die Indikatoren, die Sie sammeln möchten. Die PdhOpenQuery-Funktion gibt dieses Handle zurück.

[in] dwIntervalTime

Wartezeit in Sekunden.

[in] hNewDataEvent

Behandeln Sie das Ereignis, das PDH nach Ablauf des Zeitintervalls signalisieren soll. Um ein Ereignisobjekt zu erstellen, rufen Sie die CreateEvent-Funktion auf.

Rückgabewert

Wenn die Funktion erfolgreich ist, wird ERROR_SUCCESS zurückgegeben.

Wenn die Funktion fehlschlägt, ist der Rückgabewert ein Systemfehlercode oder ein PDH-Fehlercode. Die folgenden Werte sind möglich.

Rückgabecode Beschreibung
PDH_INVALID_HANDLE
Das Abfragehandle ist ungültig.
PDH_NO_DATA
Die Abfrage verfügt derzeit über keine Leistungsindikatoren.

Hinweise

PDH beendet den Thread, wenn Sie die PdhCloseQuery-Funktion aufrufen. Wenn Sie PdhCollectQueryDataEx mehrmals aufrufen, beendet jeder nachfolgende Aufruf den Thread aus dem vorherigen Aufruf und startet dann einen neuen Thread.

Wenn PdhCollectQueryDataEx nur für Daten aus einem Zähler aufgerufen wird instance und der Zähler instance nicht vorhanden ist, gibt die Funktion PDH_NO_DATA zurück. Wenn jedoch Daten aus mehreren Zählern abgefragt werden, gibt PdhCollectQueryDataEx möglicherweise ERROR_SUCCESS zurück, auch wenn eine der Indikatoreninstanzen noch nicht vorhanden ist. Dies liegt daran, dass nicht bekannt ist, ob der angegebene Zähler instance nicht vorhanden ist oder ob er vorhanden ist, aber noch nicht erstellt wurde. Rufen Sie in diesem Fall PdhGetRawCounterValue oder PdhGetFormattedCounterValue für jede der relevanten Indikatoreninstanzen auf, um zu bestimmen, ob sie vorhanden sind.

PDH speichert die Unformatierten Zählerwerte für die aktuelle und vorherige Auflistung. Wenn Sie den aktuellen Unformatierten Zählerwert abrufen möchten, rufen Sie die PdhGetRawCounterValue-Funktion auf. Wenn Sie einen anzeigebaren Wert für den Zählerwert berechnen möchten, rufen Sie PdhGetFormattedCounterValue auf. Wenn der Zählerpfad einen Wildcard für den namen des instance enthält, rufen Sie stattdessen die Funktionen PdhGetRawCounterArray bzw. PdhGetFormattedCounterArray auf.

Beispiele

Im folgenden Beispiel wird die Verwendung dieser Funktion veranschaulicht.


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

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows XP [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile pdh.h
Bibliothek Pdh.lib
DLL Pdh.dll

Weitere Informationen

CreateEvent

PdhCollectQueryData

PdhOpenQuery