Qt Concurrent
Le module Qt Concurrent fournit des API de haut niveau qui permettent d'écrire des programmes multithreadés sans utiliser de primitives de threading de bas niveau telles que les mutex, les verrous en lecture-écriture, les conditions d'attente ou les sémaphores. Les programmes écrits avec Qt Concurrent ajustent automatiquement le nombre de threads utilisés en fonction du nombre de cœurs de processeurs disponibles. Cela signifie que les applications écrites aujourd'hui continueront à évoluer lorsqu'elles seront déployées sur des systèmes multicœurs à l'avenir.
Qt Concurrent comprend des API de style programmation fonctionnelle pour le traitement parallèle de listes, y compris une implémentation MapReduce et FilterReduce pour les systèmes à mémoire partagée (non distribués), et des classes pour la gestion des calculs asynchrones dans les applications d'interface graphique :
- Concurrent Map et Map-Reduce
- QtConcurrent::map() applique une fonction à chaque élément d'un conteneur, en modifiant les éléments sur place.
- QtConcurrent::mapped() est comme map(), sauf qu'il renvoie un nouveau conteneur avec les modifications.
- QtConcurrent::mappedReduced() est comme mapped(), sauf que les résultats modifiés sont réduits ou repliés en un seul résultat.
- Filtre et filtre-réduction simultanés
- QtConcurrent::filter() supprime tous les éléments d'un conteneur en fonction du résultat d'une fonction de filtrage.
- QtConcurrent::filtered() est comme filter(), sauf qu'il renvoie un nouveau conteneur avec les résultats filtrés.
- QtConcurrent::filteredReduced() est comme filtered(), sauf que les résultats filtrés sont réduits ou repliés en un seul résultat.
- Exécution simultanée
- QtConcurrent::run() exécute une fonction dans un autre thread.
- Concurrent Task
- QtConcurrent::task() crée une instance de QtConcurrent::QTaskBuilder. Cet objet peut être utilisé pour ajuster les paramètres et pour lancer une tâche dans un autre thread.
- QFuture représente le résultat d'un calcul asynchrone.
- QFutureIterator permet d'itérer dans les résultats disponibles via QFuture.
- QFutureWatcher permet de surveiller un site QFuture à l'aide de signaux et de créneaux.
- QFutureSynchronizer est une classe de commodité qui synchronise automatiquement plusieurs QFutures.
- QPromise permet de signaler la progression et les résultats du calcul asynchrone à QFuture. Permet de suspendre ou d'annuler la tâche à la demande de QFuture.
Qt Concurrent prend en charge plusieurs types de conteneurs et d'itérateurs compatibles avec la STL, mais fonctionne mieux avec les conteneurs Qt XML dotés d'itérateurs à accès aléatoire, tels que QList. Les fonctions map et filter acceptent à la fois les conteneurs et les itérateurs begin/end.
Vue d'ensemble de la prise en charge des itérateurs STL :
| Type d'itérateur | Classes d'exemple | Statut du support |
|---|---|---|
| Itérateur d'entrée | Non supporté | |
| Itérateur de sortie | Non pris en charge | |
| Itérateur de progression | std::forward_list | Pris en charge |
| Itérateur bidirectionnel | std::list | Pris en charge |
| Itérateur à accès aléatoire | QListstd::vector | Pris en charge et recommandé |
Les itérateurs à accès aléatoire peuvent être plus rapides lorsque Qt Concurrent itère sur un grand nombre d'éléments légers, car ils permettent de passer à n'importe quel point du conteneur. En outre, l'utilisation d'itérateurs à accès aléatoire permet à Qt Concurrent de fournir des informations sur la progression par l'intermédiaire de QFuture::progressValue() et QFutureWatcher::progressValueChanged().
Les fonctions de modification non in situ telles que mapped() et filtered() effectuent une copie du conteneur lorsqu'elles sont appelées. Si vous utilisez des conteneurs STL, cette opération de copie peut prendre un certain temps. Dans ce cas, nous vous recommandons de spécifier les itérateurs de début et de fin du conteneur.
Utilisation du module
L'utilisation d'un module Qt nécessite l'établissement d'un lien avec la bibliothèque du module, soit directement, soit par l'intermédiaire d'autres dépendances. Plusieurs outils de construction ont un support dédié pour cela, y compris CMake et qmake.
Construction avec CMake
Utilisez la commande find_package() pour localiser les composants du module nécessaires dans le paquet Qt6:
find_package(Qt6 REQUIRED COMPONENTS Concurrent) target_link_libraries(mytarget PRIVATE Qt6::Concurrent)
Voir aussi l'aperçu de la construction avec CMake.
Construction avec qmake
Pour configurer le module afin qu'il soit construit avec qmake, ajoutez le module comme valeur de la variable QT dans le fichier .pro du projet :
QT += concurrent
Exemples
Évolution du module
Changes to Qt Concurrent liste les changements importants dans l'API et les fonctionnalités du module qui ont été effectués pour la série Qt 6 de Qt.
Licences
Le module Qt Concurrent est disponible sous licence commerciale auprès de The Qt Company. Il est également disponible sous des licences de logiciel libre : La licence GNU Lesser General Public License, version 3, ou la licence GNU General Public License, version 2. Voir Qt Licensing pour plus de détails.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.