Qt : pourquoi et quand utiliser les threads ?

Pourquoi créer des threads ?

Dans ma carrière j’ai souvent vu la même erreur répétée : une application dotée d’une interface graphique a des problèmes de fluidité de l’interface graphique. Quand on clique sur un bouton, la barre de progression ne se met pas ou mal à jour, ou bien quand on déplace la fenêtre de l’application, son contenu devient blanc, etc.

Très souvent, les développeurs qui analysent ce problème constatent qu’il est lié à l’action déclenchée par l’appui sur le bouton. Cette action étant longue, ils se rendent (parfois inconsciemment) compte qu’elle bloque le thread de l’interface graphique et décident pour résoudre le problème de mettre dans un nouveau thread le processus déclenché par l’appui sur le bouton.

C’est une solution. Elle fonctionne. Mais c’est la mauvaise réponse à un problème conceptuel simple. Elle augmente la complexité de l’application et, ce faisant, elle diminue à la fois sa maintenabilité et sa testabilité. Pire elle masque le vrai problème.

Le problème conceptuel est le suivant : le processus déclenché par l’appui sur le bouton est trop long et bloque pendant une durée trop longue l’unique thread de l’application, celui-là même qui gère l’affichage de l’interface graphique.

Dans de plus rares cas il peut s’agir d’un problème de codage : ne tenant pas compte de l’affinité de thread entre le contrôleur de la fenêtre et le contrôleur du processus qui effectue l’action liée à l’appui sur le bouton, le développeur pense que l’envoi d’un signal déclenchera nécessairement une exécution asynchrone du processus. C’est une erreur, il n’y a qu’un seul thread, l’émission du signal du bouton, qu’elle passe par la run-loop ou non, aboutira de toutes façons à l’exécution d’un processus trop long dans un thread unique.

Le forçage d’une connexion entre le signal et le slot avec le comportement Qt::QueuedConnection n’y changera rien… il n’y a qu’un seul thread et un processus bloquant.

La solution est conceptuelle, elle consiste à trouver une solution simple à un problème simple (c’est mon leitmotiv) : si le processus est trop long, il faut le raccourcir… ou plutôt le transformer en plein de processus plus courts qui passeront tous par la run-loop. L’entrelacement des sous-processus courts (< 100 ms) et des événements de l’interface graphique permettra à la fois d’exécuter le processus lié au bouton de manière rapide et aussi à l’interface graphique de rester fluide. Lisez cet article pour en savoir plus.

Qt est extrêmement puissant, il permet de faire des choses complexes simplement. Pensez toujours à la run-loop et vérifiez l’affinité des objets dont vous connectez les signaux et les slots avant d’aller voir du côté des threads.

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 4 5

Articles similaires

Qt : l’influence du... L’instanciation Ce test consiste à mesurer la durée de l’instanciation de 400 000 chaînes de caractères d’une longueur de 1 001 octets. Remarques : le test utilise
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.
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 !
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 : 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
Qt : comment implanter un... Le contrôleur Le contrôleur sert d’interface entre l’application et le worker, il orchestre le démarrage du thread, son arrêt, l’instanciation et la destruction du worker ainsi que
Qt : pourquoi et quand ut... Pourquoi créer des threads ? Dans ma carrière j’ai souvent vu la même erreur répétée : une application dotée d’une interface graphique a des problèmes de fluidité
Apprendre à développer ... Une de mes activités est la formation professionnelle à la conception et à la programmation d’applications avec Qt. J’envisage aujourd’hui de créer un MOOC payant pour partager

Laisser une réponse

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