Une file d’attente de tâches composite est une file d’attente de tâches constituée d’éléments provenant d’autres files d’attente. Les files d’attente de tâches composites sont utiles lorsqu’une tâche asynchrone doit en appeler une autre et que l’achèvement de cette tâche est une étape intermédiaire qui ne doit pas gaspiller de cycles sur le thread d’achèvement. Dans ce cas, une file d’attente composite peut être créée. Les ports de travail et d’achèvement de cette file d’attente composite utilisent tous deux le port de travail de la file d’attente d’origine.L’exemple suivant utilise le pool de threads pour le travail, mais intègre les rappels du port d’achèvement dans une fonction de rappel WindowProc Win32. Cet exemple illustre également l’arrêt correct d’une file d’attente de tâches lorsque vous l’intégrez à un autre modèle de threading.
void CreatingCompositeQueue() { XTaskQueueHandle queue; HRESULT hr = XTaskQueueCreate( XTaskQueueDispatchMode::ThreadPool, XTaskQueueDispatchMode::Manual, &queue); if (FAILED(hr)) { printf("Failed to create task queue: 0x%x\r\n", hr); return; } XTaskQueuePortHandle workPort; // Create a composite queue that uses the work port from // another queue for both the work and the completion ports. hr = XTaskQueueGetPort(queue, XTaskQueuePort::Work, &workPort); if (FAILED(hr)) { printf("Failed to get work port 0x%x\r\n", hr); XTaskQueueCloseHandle(queue); return; } XTaskQueueHandle compositeQueue; hr = XTaskQueueCreateComposite(workPort, workPort, &compositeQueue); if (FAILED(hr)) { printf("Failed to create composite queue 0x%x\r\n", hr); XTaskQueueCloseHandle(queue); return; } // Use the queue as needed. SubmitCallbacks(compositeQueue); // Wait a while for the callbacks to run. Sleep(1000); XTaskQueueCloseHandle(compositeQueue); XTaskQueueCloseHandle(queue); }
Une autre technique consiste à créer une file d’attente locale dont les types de distribution du travail et de l’achèvement sont immédiats. Un mode de distribution immédiat n’implique aucune activité asynchrone : il distribue les rappels dès qu’ils sont soumis, comme le montre l’exemple de code suivant.
void CreatingImmediateQueue() { XTaskQueueHandle queue; HRESULT hr = XTaskQueueCreate( XTaskQueueDispatchMode::Immediate, XTaskQueueDispatchMode::Immediate, &queue); if (FAILED(hr)) { printf("Failed to create task queue: 0x%x\r\n", hr); return; } // Use the queue as needed. SubmitCallbacks(queue); // Wait a while for the callbacks to run. Sleep(1000); XTaskQueueCloseHandle(queue); }