XTaskQueueRegisterMonitor
콜백이 이 큐에 제출될 때마다 호출되는 콜백을 등록합니다.
구문
HRESULT XTaskQueueRegisterMonitor(
XTaskQueueHandle queue,
void* callbackContext,
XTaskQueueMonitorCallback* callback,
XTaskQueueRegistrationToken* token
)
매개 변수
queue _In_
형식: XTaskQueueHandle
제출 콜백을 등록할 큐입니다.
callbackContext _In_opt_
형식: void*
제출 콜백에 전달할 선택적인 컨텍스트 포인터입니다.
callback _In_
형식: XTaskQueueMonitorCallback*
새 콜백을 큐에 제출할 때 호출될 콜백입니다.
token _Out_
형식: XTaskQueueRegistrationToken*
콜백을 제거하기 위해 XTaskQueueUnregisterMonitor를 호출하면 사용되는 토큰입니다.
반환 값
형식: HRESULT
HRESULT 성공 또는 오류 코드입니다.
비고
참고 항목
이 함수는 시간에 민감한 스레드에서 호출하는 것이 안전하지 않습니다. 자세한 내용은 시간에 민감한 스레드를 참조하세요.
다음 예제에서는 작업 큐를 사용하여 디스패치해야 할 항목이 있을 때 조건 변수에 신호를 표시하는 방법을 보여줍니다. 응용 프로그램은 이를 사용하여 응용 프로그램의 다른 작업과 함께 작업 큐에 사용하는 스레드를 공유할 수 있습니다.
참고 항목
SubmitCallback 은 XTaskQueueSubmitCallback 함수의 코드 예제에 정의된 도우미 함수입니다.
// We will use condition variables to signal when there is something for us
// in the queue and a bool to signal when we want the whole thing to close.
// Keep all this in a struct for convenient access
struct QueueControl
{
std::condition_variable workActivity;
std::mutex workMutex;
std::condition_variable completionActivity;
std::mutex completionMutex;
bool terminate = false;
} queueControl;
void CALLBACK TaskQueueNewItemSubmitted(void* context, XTaskQueueHandle, XTaskQueuePort port)
{
// A new callback has been submitted. notify the correct condition variable
QueueControl* queueControl = static_cast<QueueControl*>(context);
switch (port)
{
case XTaskQueuePort::Work:
queueControl->workActivity.notify_all();
break;
case XTaskQueuePort::Completion:
queueControl->completionActivity.notify_all();
break;
}
}
void CreatingTaskQueueWithManualSignaling()
{
// Create a manual task queue
XTaskQueueHandle queue;
HRESULT hr = XTaskQueueCreate(
XTaskQueueDispatchMode::Manual,
XTaskQueueDispatchMode::Manual,
&queue);
if (FAILED(hr))
{
printf("Creating queue failed: 0x%x\r\n", hr);
return;
}
// Listen to callback submitted notifications to signal
// our condition variable.
XTaskQueueRegistrationToken token;
hr = XTaskQueueRegisterMonitor(
queue, &queueControl,
TaskQueueNewItemSubmitted, &token);
std::thread workThread([&]()
{
std::unique_lock<std::mutex> lock(queueControl.workMutex);
while (!queueControl.terminate)
{
queueControl.workActivity.wait(lock);
XTaskQueueDispatch(queue, XTaskQueuePort::Work, 0);
}
});
std::thread completionThread([&]()
{
std::unique_lock<std::mutex> lock(queueControl.completionMutex);
while (!queueControl.terminate)
{
queueControl.completionActivity.wait(lock);
XTaskQueueDispatch(queue, XTaskQueuePort::Completion, 0);
}
});
SubmitCallbacks(queue);
// Wait a while for the callbacks to run
Sleep(1000);
XTaskQueueTerminate(queue, true, nullptr, nullptr);
queueControl.terminate = true;
queueControl.workActivity.notify_all();
queueControl.completionActivity.notify_all();
workThread.join();
completionThread.join();
}
요구 사항
헤더: XTaskQueue.h
라이브러리: xgameruntime.lib
지원되는 플랫폼: Windows, Xbox One 패밀리 콘솔 및 Xbox Series 콘솔