Vous pouvez avoir besoin de contrôler explicitement les threads utilisés pour le travail et les achèvements d’une file d’attente de tâches. Dans ces
cas, créez une file d’attente de tâches manuelle et distribuez vous-même les appels. Si vous utilisez des files d’attente de tâches manuelles,
vous devez vous assurer qu’elles pompent également la file d’attente de messages Windows.L’exemple suivant montre comment créer une file d’attente de tâches pompée manuellement. Il crée deux threads
STL qui distribuent les appels pour le port de travail et le port d’achèvement.
void CreatingTaskQueueWithManualThreads() { // 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; } // We create threads to pump the queue: one thread for the work port // and one thread for the completion port. std::thread workThread([queue] { // XTaskQueueDispatch returns false when there's nothing to // dispatch. Here, we wait forever for something new to come // in. This will return false only if the queue is being // terminated. while (XTaskQueueDispatch(queue, XTaskQueuePort::Work, INFINITE)); }); std::thread completionThread([queue] { // XTaskQueueDispatch returns false when there's nothing to // dispatch. Here, we wait forever for something new to come // in. This will return false only if the queue is being // terminated. while (XTaskQueueDispatch(queue, XTaskQueuePort::Completion, INFINITE)); }); SubmitCallbacks(queue); // Wait a while for the callbacks to run. Sleep(1000); // Terminating the queue will cause a waiting XTaskQueueDispatch to return // false. XTaskQueueTerminate(queue, true, nullptr, nullptr); workThread.join(); completionThread.join(); }