Visão geral da API da fila de tarefas
Uma fila de tarefas é composta por duas portas de fila: uma porta de trabalho e uma porta de conclusão. Essas portas são agrupadas no mesmo objeto porque você geralmente precisa de ambas: a porta de trabalho para realizar trabalho assíncrono e a porta de conclusão para informar o usuário sobre ele. Uma fila de tarefas é descrita da seguinte forma.- Contém duas portas de fila de tarefas.
- Cada porta de fila de tarefas pode ter seu próprio modo de despacho, que determina como os itens na fila são despachados.
- Os modos de despacho variam desde o despacho totalmente automático por meio do pool de threads do sistema até o despacho totalmente manual, no qual as tarefas precisam ser removidas explicitamente.
- Os retornos de chamada podem ser enviados para qualquer uma das portas da fila.
- As filas são representadas como identificadores. Os identificadores podem ser duplicados, o que essencialmente aumenta uma contagem de referências na fila.
- Pool de threads: os retornos de chamada enfileirados em uma fila de pool de threads são executados no pool de threads do sistema. O pool de threads invoca as chamadas em paralelo, retirando por sua vez uma chamada da fila para executar à medida que os threads do pool ficam disponíveis.
- Pool de threads serializado: os retornos de chamada são enfileirados e executados no pool de threads, mas são executados um após o outro, em vez de em paralelo em todos os threads do pool.
- Manual: os retornos de chamada enfileirados em uma fila manual não são despachados automaticamente. Cabe a você despachá-los em qualquer thread que desejar. Se você usar filas de tarefas manuais, deverá garantir que também bombeie a fila de mensagens do Windows.
- Imediato: o modo de despacho imediato não enfileira nada. Ele executa imediatamente a chamada no thread que enviou o retorno de chamada.
XTaskQueueDuplicateHandle,
XTaskQueueSubmitCallback, XTaskQueueSubmitDelayedCallback e
XTaskQueueCreateComposite adicionam uma referência ao identificador da fila. Isso
significa que a fila não é de fato destruída até que todos os retornos de chamada
tenham sido concluídos.
Um identificador de fila de tarefas é um recurso por processo e não pode ser empacotado (marshaled) nem
usado fora do processo.
Padrão de uso
O padrão de uso típico de uma fila de tarefas é o seguinte.- Crie um identificador de fila de tarefas e especifique os modos de despacho de cada porta.
- Se você estiver usando despacho manual, estabeleça threads específicos do aplicativo para chamar a função de despacho da fila.
-
Use a fila como parâmetro para chamadas do Microsoft Game Development Kit (GDK) ou envie
diretamente usando
XTaskQueueCallback. - Opcionalmente, encerre a fila de tarefas quando o aplicativo for desligado.
Tópicos de instruções da fila de tarefas assíncronas
Esta seção fornece exemplos de instruções para cenários comuns da fila de tarefas assíncronas.Nesta seção
Criar uma fila de tarefas de pool de threads Fornece um exemplo que mostra como criar uma fila de tarefas que despacha os retornos de chamada de trabalho e de conclusão no pool de threads do sistema. Enviar retornos de chamada Fornece um exemplo que mostra como um retorno de chamada é enviado para a porta de trabalho ou para a porta de conclusão de uma fila de tarefas. Duplicar um identificador de fila de tarefas Fornece um exemplo que mostra como duplicar um identificador de fila de tarefas. Se você tiver um trabalho de longa duração, talvez queira duplicar o identificador da fila de tarefas durante o trabalho. Dessa forma, quem chamarXTaskQueueCloseHandle não fechará a fila enquanto você ainda precisar dela.
Criar uma fila de tarefas manual
Fornece um exemplo que mostra como criar uma fila de tarefas bombeada manualmente. Ele cria dois threads STL que despacham chamadas tanto para a porta de trabalho quanto para a porta de conclusão.
Usar eventos para controlar o despacho de filas manuais
Fornece um exemplo que mostra como usar uma fila de tarefas para sinalizar uma variável de condição quando ela tiver itens a despachar.
Usar uma fila de tarefas com um loop de mensagens do Windows
Fornece um exemplo que usa o pool de threads para o trabalho, mas integra os retornos de chamada da porta de conclusão em um procedimento de janela (Window proc) do Win32. Este exemplo também demonstra o encerramento correto de uma fila de tarefas quando você a integra a outro modelo de threading.
Usar a fila de tarefas do processo
Fornece um exemplo que mostra como usar a fila de tarefas do processo. A fila de tarefas do processo padrão usa o pool de threads para o despacho de trabalho e de conclusão.
Criar uma fila de tarefas composta
Fornece um exemplo que usa o pool de threads para o trabalho, mas integra os retornos de chamada da porta de conclusão em 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 está integrando a outro modelo de threading.
Usar retornos de chamada atrasados
Fornece um exemplo que mostra como usar retornos de chamada atrasados, invocando 10 retornos de chamada, um a cada 500 ms. Use uma fila de tarefas para enviar retornos de chamada no futuro usando a API XTaskQueueSubmitDelayedCallback. Dessa forma, você pode repetir uma chamada com falha após um pequeno atraso ou usá-la como um temporizador barato para eventos periódicos.
Usar um waiter de fila de tarefas
Fornece um exemplo que mostra como usar um waiter de fila de tarefas. 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.
