Vue d’ensemble de l’API de file d’attente de tâches
Une file d’attente de tâches est un composite de deux ports de file d’attente : un port de travail et un port d’achèvement. Ces ports sont regroupés dans le même objet, car vous avez souvent besoin des deux : le port de travail pour effectuer le travail asynchrone et le port d’achèvement pour en informer l’utilisateur. Une file d’attente de tâches se décrit comme suit.- Elle contient deux ports de file d’attente de tâches.
- Chaque port de file d’attente de tâches peut avoir son propre mode de distribution, qui détermine la façon dont les éléments de la file d’attente sont distribués.
- Les modes de distribution vont de la distribution entièrement automatique via le pool de threads système à la distribution entièrement manuelle, où les tâches doivent être retirées explicitement.
- Des rappels peuvent être soumis à l’un ou l’autre des ports de la file d’attente.
- Les files d’attente sont représentées par des handles. Les handles peuvent être dupliqués, ce qui revient essentiellement à augmenter un nombre de références sur la file d’attente.
- Thread Pool (pool de threads) : les rappels mis en file d’attente dans une file de pool de threads sont exécutés sur le pool de threads système. Le pool de threads appelle les appels en parallèle, en prenant tour à tour un appel à exécuter dans la file d’attente à mesure que des threads du pool deviennent disponibles.
- Serialized Thread Pool (pool de threads sérialisé) : les rappels sont mis en file d’attente et exécutés sur le pool de threads, mais ils s’exécutent l’un après l’autre au lieu de s’exécuter en parallèle sur tous les threads du pool.
- Manual (manuel) : les rappels mis en file d’attente dans une file manuelle ne sont pas distribués automatiquement. C’est à vous de les distribuer sur le thread de votre choix. Si vous utilisez des files d’attente de tâches manuelles, vous devez vous assurer de pomper également la file d’attente de messages Windows.
- Immediate (immédiat) : le mode de distribution immédiat ne met rien en file d’attente. Il exécute immédiatement l’appel sur le thread qui a soumis le rappel.
XTaskQueueDuplicateHandle,
XTaskQueueSubmitCallback, XTaskQueueSubmitDelayedCallback et
XTaskQueueCreateComposite ajoutent tous une référence au handle de file d’attente. Cela
signifie que la file d’attente n’est réellement détruite qu’une fois tous les rappels
terminés.
Un handle de file d’attente de tâches est une ressource propre au processus et ne peut pas être marshalé ni
utilisé en dehors du processus.
Modèle d’utilisation
Le modèle d’utilisation typique d’une file d’attente de tâches est le suivant.- Créez un handle de file d’attente de tâches, puis spécifiez les modes de distribution de chaque port.
- Si vous utilisez la distribution manuelle, établissez des threads propres à l’application pour appeler la fonction de distribution de la file d’attente.
-
Utilisez la file d’attente comme paramètre des appels du Microsoft Game Development Kit (GDK) ou soumettez
directement à l’aide de
XTaskQueueCallback. - Vous pouvez éventuellement arrêter la file d’attente de tâches lorsque votre application s’arrête.
Rubriques de procédures relatives à la file d’attente de tâches asynchrones
Cette section fournit des exemples de procédures pour des scénarios courants de file d’attente de tâches asynchrones.Dans cette section
Création d’une file d’attente de tâches de pool de threads Fournit un exemple qui montre comment créer une file d’attente de tâches qui distribue les rappels de travail et d’achèvement sur le pool de threads système. Soumission de rappels Fournit un exemple qui montre comment un rappel est soumis au port de travail ou au port d’achèvement d’une file d’attente de tâches. Duplication d’un handle de file d’attente de tâches Fournit un exemple qui montre comment dupliquer un handle de file d’attente de tâches. Si vous avez un travail de longue durée, vous pouvez dupliquer le handle de la file d’attente de tâches pour la durée de ce travail. Ainsi, quiconque appelleXTaskQueueCloseHandle ne fermera pas la file d’attente tant que vous en avez encore besoin.
Création d’une file d’attente de tâches manuelle
Fournit un exemple qui 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.
Utilisation d’événements pour contrôler la distribution d’une file d’attente manuelle
Fournit un exemple qui montre comment utiliser une file d’attente de tâches pour signaler une variable de condition lorsqu’elle contient des éléments à distribuer.
Utilisation d’une file d’attente de tâches avec une boucle de messages Windows
Fournit un exemple qui utilise le pool de threads pour le travail, mais intègre les rappels du port d’achèvement dans une procédure de fenêtre Win32. Cet exemple montre également comment arrêter correctement une file d’attente de tâches lorsque vous l’intégrez à un autre modèle de threading.
Utilisation de la file d’attente de tâches du processus
Fournit un exemple qui montre comment utiliser la file d’attente de tâches du processus. La file d’attente de tâches du processus par défaut utilise le pool de threads pour la distribution du travail et des achèvements.
Création d’une file d’attente de tâches composite
Fournit un exemple qui 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 montre également comment arrêter correctement une file d’attente de tâches lorsque vous l’intégrez à un autre modèle de threading.
Utilisation de rappels différés
Fournit un exemple qui montre comment utiliser des rappels différés, en appelant 10 rappels une fois toutes les 500 ms. Utilisez une file d’attente de tâches pour soumettre des rappels dans le futur à l’aide de l’API XTaskQueueSubmitDelayedCallback. Vous pouvez ainsi réessayer un appel ayant échoué après un court délai, ou l’utiliser comme minuteur peu coûteux pour des événements périodiques.
Utilisation d’un waiter de file d’attente de tâches
Fournit un exemple qui montre comment utiliser un waiter de file d’attente de tâches. Vous pouvez inscrire un handle de noyau Win32 auprès d’une file d’attente de tâches. Votre rappel sera soumis à la file d’attente lorsque le handle sera signalé.
