다음을 통해 공유


XTaskQueueRegisterWaiter

작업 큐를 사용하여 대기 핸들을 등록합니다.

구문

HRESULT XTaskQueueRegisterWaiter(  
         XTaskQueueHandle queue,  
         XTaskQueuePort port,  
         HANDLE waitHandle,  
         void* callbackContext,  
         XTaskQueueCallback* callback,  
         XTaskQueueRegistrationToken* token  
)  

매개 변수

queue _In_
형식: XTaskQueueHandle

콜백을 제출할 큐입니다.

port _In_
형식: XTaskQueuePort

콜백을 제출할 포트입니다. 콜백은 작업 또는 완료 포트에 할당될 수 있습니다.

waitHandle _In_
형식: HANDLE

모니터할 핸들입니다.

참고 항목

신호를 받았을 때 콜백이 호출되도록 만드는 대기 핸들입니다. 대기 핸들은 일반적으로 자동 또는 수동 재설정 이벤트입니다. 대기 핸들이 수동 재설정인 경우, 이벤트가 신호를 받은 한 반복해서 콜백이 호출됩니다. 이를 원하지 않는다면, 콜백 중간에 이벤트를 재설정하거나 대기 콜백을 등록 해제하세요.

callbackContext _In_opt_
형식: void*

콜백에 전달할 선택적인 컨텍스트 포인터입니다.

callback _In_
형식: XTaskQueueCallback*

콜백 함수에 대한 포인터입니다.

token _Out_
형식: XTaskQueueRegistrationToken*

등록 토큰입니다. 대기를 등록 해제하기 위해 XTaskQueueUnregisterWaiter에 전달될 수 있습니다.

반환 값

형식: HRESULT

HRESULT 성공 또는 오류 코드입니다.

설명

참고 항목

이 함수는 시간에 민감한 스레드에서 호출하는 것이 안전하지 않습니다. 자세한 내용은 시간에 민감한 스레드를 참조하세요.

대기 핸들이 충족되면 작업 큐가 지정된 콜백을 호출합니다. 이것은 신호를 받은 핸들에 대한 응답으로 작업 큐에 항목을 추가할 수 있는 효율적인 방법을 제공합니다.

다음 예에서는 작업 큐를 사용하여 Win32 커널 핸들을 등록합니다. 핸들이 신호를 받으면 큐에 콜백이 제출됩니다. 일반적으로 신호 전달에 사용할 자동 재설정 이벤트를 생성합니다. 핸들이 자동으로 재설정되지 않으면 핸들에 신호가 전달되는 동안에는 현재 콜백이 완료되어야 새 콜백이 전송됩니다.

void CreatingTaskQueueWaiter()
{
    HANDLE waitEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
    if (waitEvent == nullptr)
    {
        printf("Error creating wait handle: %d\r\n", GetLastError());
        return;
    }

    XTaskQueueHandle queue;

    HRESULT hr = XTaskQueueCreate(
        XTaskQueueDispatchMode::ThreadPool,
        XTaskQueueDispatchMode::ThreadPool, 
        &queue);

    if (FAILED(hr))
    {
        printf("Error creating task queue: %x\n", hr);
        CloseHandle(waitEvent);
        return;
    }

    auto callback = [](void*, bool)
    {
        printf("Callback invoked.\r\n");
    };

    XTaskQueueRegistrationToken token;

    hr = XTaskQueueRegisterWaiter(
        queue, 
        XTaskQueuePort::Completion, 
        waitEvent, 
        nullptr, 
        callback, 
        &token);

    if (FAILED(hr))
    {
        printf("Error registering task queue waiter: %x\n", hr);
        CloseHandle(waitEvent);
        XTaskQueueCloseHandle(queue);
        return;
    }

    // Now, whenever our wait event becomes signaled the callback will be called.
    for (uint32_t i = 0; i < 5; i++)
    {
        SetEvent(waitEvent);
        Sleep(100);
    }

    // Note: unregistering the waiter is optional
    XTaskQueueUnregisterWaiter(queue, token);
    XTaskQueueCloseHandle(queue);
    CloseHandle(waitEvent);
}

요구 사항

헤더: XTaskQueue.h

라이브러리: xgameruntime.lib

지원되는 플랫폼: Windows, Xbox One 패밀리 콘솔 및 Xbox Series 콘솔

참고 항목

XTaskQueue 멤버
비동기 프로그래밍 모델
비동기 작업 큐 디자인