방법: 작업 큐 대기자 사용
예제
작업 큐에 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);
}
샘플 출력
Callback invoked.
Callback invoked.
Callback invoked.
Callback invoked.
Callback invoked.