다음을 통해 공유


PdhCollectQueryDataEx 함수(pdh.h)

별도 스레드를 사용하여 지정된 쿼리의 모든 카운터에 대한 현재 원시 데이터 값을 수집합니다. 그런 다음, 함수는 애플리케이션 정의 이벤트를 알리고 반환하기 전에 지정된 시간 간격을 기다립니다.

구문

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

매개 변수

[in] hQuery

쿼리의 핸들입니다. 쿼리는 수집하려는 카운터를 식별합니다. PdhOpenQuery 함수는 이 핸들을 반환합니다.

[in] dwIntervalTime

대기할 시간 간격(초)입니다.

[in] hNewDataEvent

시간 간격이 만료된 후 PDH가 신호를 표시할 이벤트에 대한 핸들입니다. 이벤트 개체를 만들려면 CreateEvent 함수를 호출합니다.

반환 값

함수가 성공하면 ERROR_SUCCESS 반환합니다.

함수가 실패하면 반환 값은 시스템 오류 코드 또는 PDH 오류 코드입니다. 가능한 값은 다음과 같습니다.

반환 코드 설명
PDH_INVALID_HANDLE
쿼리 핸들이 잘못되었습니다.
PDH_NO_DATA
쿼리에 현재 카운터가 없습니다.

설명

PDH는 PdhCloseQuery 함수를 호출할 때 스레드를 종료합니다. PdhCollectQueryDataEx를 두 번 이상 호출하는 경우 각 후속 호출은 이전 호출에서 스레드를 종료한 다음 새 스레드를 시작합니다.

하나의 카운터 instance 데이터만 PdhCollectQueryDataEx가 호출되고 카운터 instance 존재하지 않는 경우 함수는 PDH_NO_DATA 반환합니다. 그러나 둘 이상의 카운터에서 데이터를 쿼리하는 경우 카운터 인스턴스 중 하나가 아직 없더라도 PdhCollectQueryDataEx 는 ERROR_SUCCESS 반환할 수 있습니다. 이는 지정된 카운터 instance 존재하지 않는지 또는 이 카운터가 존재하지만 아직 만들어지지 않은지 알 수 없기 때문입니다. 이 경우 관심 있는 각 카운터 인스턴스에 대해 PdhGetRawCounterValue 또는 PdhGetFormattedCounterValue 를 호출하여 해당 인스턴스가 있는지 확인합니다.

PDH는 현재 및 이전 컬렉션에 대한 원시 카운터 값을 저장합니다. 현재 원시 카운터 값을 검색하려면 PdhGetRawCounterValue 함수를 호출합니다. 카운터 값에 대해 표시 가능한 값을 계산하려면 PdhGetFormattedCounterValue를 호출합니다. 카운터 경로에 instance 이름에 대한 와일드카드가 포함된 경우 PdhGetRawCounterArrayPdhGetFormattedCounterArray 함수를 각각 호출합니다.

예제

다음 예제에서는 이 함수를 사용하는 방법을 보여줍니다.


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

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows XP [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 pdh.h
라이브러리 Pdh.lib
DLL Pdh.dll

추가 정보

CreateEvent

PdhCollectQueryData

PdhOpenQuery