Skip to main content
Este tópico descreve a fila de tarefas do Microsoft Game Development Kit (GDK) usada em conjunto com o padrão de design assíncrono do Microsoft Game Development Kit (GDK). Uma fila de tarefas é uma API para enfileirar trabalho e retornos de chamada de tarefas de conclusão. Uma fila de tarefas pode ser configurada em um de vários modos de despacho diferentes, incluindo um mecanismo de despacho manual que você pode usar para gerenciar cuidadosamente as cargas de trabalho de jogos.

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.
Você pode configurar cada porta da fila de tarefas de forma independente especificando um modo de despacho. Um modo de despacho determina como os retornos de chamada enfileirados em uma porta são processados. Há vários modos de despacho.
  • 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.
Um identificador de fila de tarefas é um recurso compartilhável. Fechar o identificador libera uma referência na fila. A fila não é de fato destruída até que todas as referências sejam liberadas. 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.
  1. Crie um identificador de fila de tarefas e especifique os modos de despacho de cada porta.
  2. Se você estiver usando despacho manual, estabeleça threads específicos do aplicativo para chamar a função de despacho da fila.
  3. Use a fila como parâmetro para chamadas do Microsoft Game Development Kit (GDK) ou envie diretamente usando XTaskQueueCallback.
  4. 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 chamar XTaskQueueCloseHandle 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.

Documentação de referência da API

Last modified on October 6, 2026