방법: 지연된 콜백 사용
예시
작업 큐를 사용하면 나중에 XTaskQueueSubmitDelayedCallback
API를 통해 콜백을 제출할 수 있습니다. 이렇게 하면 실패한 호출을 잠시 후 다시 시도할 수 있으며, 주기적으로 발생하는 이벤트의 저렴한 타이머로 사용할 수도 있습니다.
다음 예제에서는 500ms 간격으로 10개의 콜백을 호출합니다.
void SubmittingDelayedCallback()
{
XTaskQueueHandle queue;
HRESULT hr = XTaskQueueCreate(
XTaskQueueDispatchMode::ThreadPool,
XTaskQueueDispatchMode::ThreadPool,
&queue);
if (FAILED(hr))
{
printf("Failed to create task queue: 0x%x\r\n", hr);
return;
}
struct CallContext
{
DWORD count;
XTaskQueueHandle queue;
XTaskQueueCallback* callback;
} callContext;
auto callback = [](void* context, bool cancel)
{
CallContext *callContext = static_cast<CallContext*>(context);
callContext->count++;
printf("Periodic callback %d\r\n", callContext->count);
if (callContext->count != 10 && !cancel)
{
HRESULT hr = XTaskQueueSubmitDelayedCallback(
callContext->queue,
XTaskQueuePort::Completion,
500,
callContext,
callContext->callback);
if (FAILED(hr))
{
printf("Failed submitting next callback: 0x%x\r\n", hr);
callContext->count = 10; // Prevents us from waiting forever.
}
}
};
callContext.count = 0;
callContext.queue = queue;
callContext.callback = callback;
// Use the task queue to make 10 periodic calls.
hr = XTaskQueueSubmitDelayedCallback(
queue,
XTaskQueuePort::Completion,
500,
&callContext,
callback);
if (FAILED(hr))
{
printf("Failed submitting delayed callback: 0x%x\r\n", hr);
XTaskQueueCloseHandle(queue);
return;
}
// Now, wait for all of the calls to be completed.
while (callContext.count != 10)
{
Sleep(1000);
}
XTaskQueueTerminate(queue, true, nullptr, nullptr);
XTaskQueueCloseHandle(queue);
}
샘플 출력
Periodic callback 1
Periodic callback 2
Periodic callback 3
Periodic callback 4
Periodic callback 5
Periodic callback 6
Periodic callback 7
Periodic callback 8
Periodic callback 9
Periodic callback 10