Bagikan melalui


Fungsi PdhCollectQueryDataEx (pdh.h)

Menggunakan utas terpisah untuk mengumpulkan nilai data mentah saat ini untuk semua penghitung dalam kueri yang ditentukan. Fungsi kemudian memberi sinyal peristiwa yang ditentukan aplikasi dan menunggu interval waktu yang ditentukan sebelum kembali.

Sintaks

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

Parameter

[in] hQuery

Menangani kueri. Kueri mengidentifikasi penghitung yang ingin Anda kumpulkan. Fungsi PdhOpenQuery mengembalikan handel ini.

[in] dwIntervalTime

Interval waktu untuk menunggu, dalam hitungan detik.

[in] hNewDataEvent

Tangani ke peristiwa yang Anda inginkan agar PDH memberi sinyal setelah interval waktu berakhir. Untuk membuat objek peristiwa, panggil fungsi CreateEvent .

Nilai kembali

Jika fungsi berhasil, fungsi akan mengembalikan ERROR_SUCCESS.

Jika fungsi gagal, nilai yang dikembalikan adalah kode kesalahan sistem atau kode kesalahan PDH. Berikut ini adalah nilai yang mungkin.

Menampilkan kode Deskripsi
PDH_INVALID_HANDLE
Handel kueri tidak valid.
PDH_NO_DATA
Kueri saat ini tidak memiliki penghitung apa pun.

Keterangan

PDH mengakhiri utas saat Anda memanggil fungsi PdhCloseQuery . Jika Anda memanggil PdhCollectQueryDataEx lebih dari sekali, setiap panggilan berikutnya mengakhiri utas dari panggilan sebelumnya lalu memulai utas baru.

Ketika PdhCollectQueryDataEx dipanggil untuk data dari satu instans penghitung saja dan instans penghitung tidak ada, fungsi mengembalikan PDH_NO_DATA. Namun, jika data dari lebih dari satu penghitung dikueri, PdhCollectQueryDataEx dapat mengembalikan ERROR_SUCCESS bahkan jika salah satu instans penghitung belum ada. Ini karena tidak diketahui apakah instans penghitung yang ditentukan tidak ada, atau jika akan ada tetapi belum dibuat. Dalam hal ini, panggil PdhGetRawCounterValue atau PdhGetFormattedCounterValue untuk setiap instans penghitung yang menarik untuk menentukan apakah ada.

PDH menyimpan nilai penghitung mentah untuk koleksi saat ini dan sebelumnya. Jika Anda ingin mengambil nilai penghitung mentah saat ini, panggil fungsi PdhGetRawCounterValue . Jika Anda ingin menghitung nilai yang dapat ditampilkan untuk nilai penghitung, panggil PdhGetFormattedCounterValue. Jika jalur penghitung berisi kartubebas untuk nama instans, sebagai gantinya panggil fungsi PdhGetRawCounterArray dan PdhGetFormattedCounterArray .

Contoh

Contoh berikut menunjukkan cara menggunakan fungsi ini.


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

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows XP [hanya aplikasi desktop]
Server minimum yang didukung Windows Server 2003 [hanya aplikasi desktop]
Target Platform Windows
Header pdh.h
Pustaka Pdh.lib
DLL Pdh.dll

Lihat juga

CreateEvent

PdhCollectQueryData

PdhOpenQuery