Vous pouvez inscrire un handle de noyau Win32 auprès d’une file d’attente de tâches. Votre rappel sera soumis à la file d’attente lorsque le handle sera signalé. En général, vous créez un événement à réinitialisation automatique pour la signalisation. Si le handle n’est pas à réinitialisation automatique, un nouveau rappel est soumis à l’achèvement du rappel actuel tant que le handle reste signalé.L’exemple suivant montre comment utiliser un waiter de file d’attente de tâches.
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); }