Qt Concurrent
Le module Qt Concurrent fournit des API de haut niveau qui permettent d'écrire des programmes multithreads sans avoir recours à des primitives de threading de bas niveau telles que les mutex, les verrous de 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 processeur disponibles. Cela signifie que les applications écrites aujourd’hui continueront à s’adapter 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, notamment une implémentation de MapReduce et FilterReduce pour les systèmes à mémoire partagée (non distribués), ainsi que des classes permettant de gérer les calculs asynchrones dans les applications GUI :
- Map et Map-Reduce concurrents
- QtConcurrent::map() applique une fonction à chaque élément d’un conteneur, en modifiant les éléments sur place.
- QtConcurrent::mapped() est similaire à map(), à la différence qu’elle renvoie un nouveau conteneur intégrant les modifications.
- QtConcurrent::mappedReduced() est similaire à mapped(), à la différence que les résultats modifiés sont réduits ou regroupés en un seul résultat.
- Filtre et Filter-Reduce concurrents
- QtConcurrent::filter() supprime tous les éléments d'un conteneur en fonction du résultat d'une fonction de filtrage.
- QtConcurrent::filtered() est similaire à filter(), à la différence qu'il renvoie un nouveau conteneur contenant les résultats filtrés.
- QtConcurrent::filteredReduced() fonctionne comme filtered(), à la différence près que les résultats filtrés sont réduits ou regroupés en un seul résultat.
- Exécution concurrente
- QtConcurrent::run() exécute une fonction dans un autre thread.
- Tâche concurrente
- QtConcurrent::task() crée une instance de ` QtConcurrent::QTaskBuilder`. Cet objet peut être utilisé pour ajuster des paramètres et pour lancer une tâche dans un thread distinct.
- QFuture représente le résultat d’un calcul asynchrone.
- QFutureIterator Permet de parcourir les résultats disponibles via ` QFuture`.
- QFutureWatcher permet de surveiller un ` QFuture ` à l'aide de signaux et de slots.
- QFutureSynchronizer est une classe utilitaire qui synchronise automatiquement plusieurs QFutures.
- QPromise fournit un moyen de signaler la progression et les résultats du calcul asynchrone à ` QFuture`. Permet de suspendre ou d'annuler la tâche lorsque ` QFuture` le demande.
Qt Concurrent Prend en charge plusieurs types de conteneurs et d’itérateurs compatibles STL, mais fonctionne mieux avec les conteneurs Qt 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 de début/fin.
Présentation de la prise en charge des itérateurs STL :
| Type d’itérateur | Exemples de classes | Statut de prise en charge |
|---|---|---|
| Itérateur d'entrée | Non pris en charge | |
| Itérateur de sortie | Non pris en charge | |
| Itérateur vers l'avant | std::forward_list | Pris en charge |
| Itérateur bidirectionnel | std::list | Prise en charge |
| Itérateur à accès aléatoire | QList, std::vector | Pris en charge et recommandé |
Les itérateurs à accès aléatoire peuvent s'avérer plus rapides dans les cas où Qt Concurrent itère sur un grand nombre d'éléments légers, car ils permettent de passer directement à n'importe quel point du conteneur. De plus, l'utilisation d'itérateurs à accès aléatoire permet à Qt Concurrent de fournir des informations sur la progression via QFuture::progressValue() et QFutureWatcher::progressValueChanged().
Les fonctions de modification non in situ, telles que `mapped()` et `filtered()`, créent 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 plutôt les itérateurs de début et de fin du conteneur.
Utilisation du module
L'utilisation d'un module Qt nécessite une liaison avec la bibliothèque du module, soit directement, soit via d'autres dépendances. Plusieurs outils de compilation prennent cela en charge, notamment CMake et qmake.
Compilation 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 également la présentation de la compilation avec CMake.
Compilation avec qmake
Pour configurer le module en vue d'une compilation avec qmake, ajoutez le module en tant que valeur de la variable ` QT ` dans le fichier .pro du projet :
QT += concurrentExemples
Évolution du module
La section «Modifications apportées à Qt Concurrent » répertorie les modifications importantes apportées à l’API et aux fonctionnalités du module dans le cadre de 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 licence de logiciel libre : la licence publique générale restreinte GNU, version 3, ou la licence publique générale GNU, version 2. Pour plus d'informations, consultez la page Licences Qt.
© 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.