Uma fila de tarefas composta é uma fila de tarefas formada por partes de outras filas. Filas de tarefas compostas são úteis quando uma tarefa assíncrona precisa chamar outra, e a conclusão dessa tarefa é uma etapa intermediária que não deve desperdiçar ciclos no thread de conclusão. Nesse caso, uma fila composta pode ser criada. As portas de trabalho e de conclusão dessa fila composta usam a porta de trabalho da fila original.O exemplo a seguir usa o pool de threads para o trabalho, mas integra os retornos de chamada da porta de conclusão a uma função de retorno de chamada WindowProc do Win32. Este exemplo também demonstra o encerramento correto de uma fila de tarefas quando você a integra a outro modelo 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); }
Outra técnica para isso é criar uma fila local cujos tipos de despacho de trabalho e de conclusão sejam imediatos. Um modo de despacho imediato não envolve nenhuma atividade assíncrona: ele despacha os retornos de chamada assim que são enviados, conforme mostrado no exemplo de código a seguir.
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); }