Qt : comment implanter un thread

Il existe plusieurs façons d’implanter des threads dans son application Qt.  Voici la méthode que je préconise.

J’en profite pour rappeler que c’est un abus de langage car avec Qt vous n’utilisez qu’un contrôleur de threads.

Les techniques les plus courantes sont :

  1. Surcharger la classe QThread et implanter la fonction virtuelle run().
  2. Utiliser le design pattern Worker.

Les concepteurs de Qt découragent l’utilisation la première solution, elle offre moins de contrôle sur l’exécution du thread. Cependant, mon avis est que pour des tâches simples, courtes à coder et qui ne nécessitent pas une forte intégration avec le reste de l’application par l’usage de signaux par exemple, autant surcharger la classe QThread, cela sera plus léger et plus rapide à coder.

L’utilisation du design pattern Worker est beaucoup plus puissante, facile à maintenir et facile à tester. Il s’agit simplement de séparer l’interface de contrôle du thread (démarrage, communication, mise en pause, arrêt) de son métier (le processus qu’il exécute).

La partie contrôle du thread sera gérée par une classe héritant de QObject. Le worker en lui-même, c’est-à-dire la partie métier, sera codée dans une autre classe qui héritera elle aussi de QObject.

Comme vous allez le voir cela offre un grand nombre de possibilités.

  • L’utilisation des signaux et des slots pour la destruction automatique des objets.
  • La possibilité pour l’utilisateur d’interrompre temporairement le traitement.
  • Un contrôle accru sur le fonctionnement du thread et une grande simplicité dans la synchronisation avec les autres threads si nécessaire.
Le Worker

Tout d’abord intéressons au Worker, c’est lui qui fera le boulot.

Dans l’interface du Worker nous avons prévu des mécanismes permettant de contrôler le flux (démarrer, interrompre et reprendre) ainsi que des signaux permettant d’informer le reste du monde que le traitement a démarré, a été interrompu et terminé.

La fonction qui contient le métier est iteration().

Nous affichons pour chaque fonction le thread dans lequel elle s’exécute. Vous verrez qu’il ne s’agit pas toujours du thread dans lequel tourne le worker.

Le fonctionnement de ce worker est le suivant :

  • Après avoir démarré il fait des itérations sur un traitement qui dure 100 ms. Nous avons simulé ce traitement en effectuant une pause dans le thread pendant 100 ms, comme si nous faisons un travail. Vous remarquerez que l’application n’est pas bloquée pour autant.
  • Si le worker est interrompu (canRun_ = false), le thread continue à tourner, mais simplement on ne fait rien dans l’itération.
  • Si le worker est remis en route (canRun_ = true), le travail reprend dans l’itération.

Partagez cet article !

Abonnez-vous à notre newsletter !

Si vous souhaitez être notifié lorsqu'un nouvel article est publié, abonnez-vous à notre newsletter et vous recevrez un email dès qu'un article sera publié.

Pages : 1 2 3

Articles similaires

Qt : pourquoi et quand ut... La gestion des threads dans Qt est simple mais elle mérite quelques explications car elle engendre souvent des problèmes conceptuels chez les développeurs peu expérimentés en Qt.
Qt : distribuer ses appli... La distribution d’une application est une étape importante de la vie d’une application, elle nécessite d’être pensée très tôt dans la conception. Cette série d’articles présente les
Adopter les flux tirés d... Nous abordons un des points essentiels de l’architecture réseau et applicative efficace et économe : les flux tirés. Partagez cet article ! Abonnez-vous à notre newsletter !
Qt : comment implanter un... Il existe plusieurs façons d’implanter des threads dans son application Qt.  Voici la méthode que je préconise. Partagez cet article ! Abonnez-vous à notre newsletter ! Si
Livre Maîtrisez Qt 5 ... La seconde édition du livre de Tristan Israël, Maîtrisez Qt 5 – Développement d’applications professionnelles, est parue. Vous pouvez le découvrir sur le site des éditions ENI.
Utiliser la technique du ... Le lazy-loading, ou chargement paresseux en français, est une réponse simple à la question simple “pourquoi charger plus de données que nous ne pouvons en afficher ?”.
Qt : Traiter une liste de... Pour qu’une interface graphique reste fluide aux yeux de l’utilisateur, le thread qui la gère ne doit jamais être interrompu plus d’une poignée de millisecondes. Or le
Qt : l’influence du... Lorsqu’on développe une application mutli-plateformes il est important de se poser la question des performances sur les plateformes ciblées. A machine égale, selon le compilateur utilisé les

Laisser une réponse

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *