Você pode registrar um identificador de kernel do Win32 em uma fila de tarefas. Seu retorno de chamada será enviado para a fila quando o identificador for sinalizado. Normalmente, você criaria um evento de redefinição automática para usar na sinalização. Se o identificador não for de redefinição automática, um novo retorno de chamada será enviado quando o retorno de chamada atual for concluído, enquanto o identificador permanecer sinalizado.O exemplo a seguir mostra como usar um waiter de fila de tarefas.
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); }