1. Livres & vidéos
  2. Framework PyQt
  3. Le multithreading en PyQt et sujets connexes
Extrait - Framework PyQt Développez vos interfaces graphiques en Python avec PyQt6
Extraits du livre
Framework PyQt Développez vos interfaces graphiques en Python avec PyQt6
3 avis
Revenir à la page d'achat du livre

Le multithreading en PyQt et sujets connexes

Introduction

1. Contexte du chapitre

Le cœur de ce chapitre aborde la notion fondamentale de multithreading, un concept essentiel en programmation moderne, notamment pour les applications interactives. De manière simplifiée, chaque application exécutée sur un ordinateur fonctionne dans son propre processus, une entité isolée contenant son propre espace mémoire et s’exécutant de manière indépendante des autres processus.

Le multithreading consiste à faire coexister plusieurs threads au sein d’une même application. Un thread peut être vu comme une unité d’exécution légère qui partage l’espace mémoire et les ressources de son processus parent. Chaque thread peut être chargé d’une tâche spécifique, permettant ainsi d’exécuter plusieurs opérations en parallèle.

L’un des principaux avantages du multithreading est de permettre des appels asynchrones au sein de l’application. Lorsqu’une application accède à une ressource externe, comme une base de données, une API web, ou un fichier volumineux, le temps de réponse peut être variable. Une requête synchrone pourrait bloquer l’application entière en attendant la réponse, ce qui entraîne un effet de freeze peu agréable pour l’utilisateur....

Utilisation de la classe QTimer

1. Introduction

L’utilisation de la classe QTimer en PyQt6 permet de différer l’exécution d’un traitement en définissant des intervalles de temps précis. Par exemple, en spécifiant un intervalle de 1000 millisecondes (1 seconde), le signal timeout() est émis toutes les secondes, déclenchant ainsi le traitement souhaité. Cette approche est particulièrement utile pour exécuter des tâches périodiques ou pour retarder l’exécution d’une fonction sans bloquer l’interface utilisateur. Cependant, pour des tâches plus complexes ou nécessitant une gestion plus fine des ressources, il est recommandé d’utiliser le multithreading, que nous aborderons dans la suite de ce chapitre.

Pour illustrer l’utilisation de QTimer, considérons le développement d’une petite application qui affiche l’heure courante, mise à jour chaque seconde. Cette application créera une instance de QTimer, connectera son signal timeout() à une fonction mettant à jour l’affichage de l’heure, et démarrera le timer avec un intervalle de 1000 millisecondes. Ainsi, l’heure affichée sera rafraîchie automatiquement chaque seconde, offrant une interface utilisateur réactive et précise.

2. Application utilisant QTimer

Nous allons approfondir l’utilisation de la classe QTimer pour créer une application qui affiche l’heure courante, mise à jour chaque seconde. Cette approche est couramment utilisée pour des tâches nécessitant une exécution périodique, comme la mise à jour d’une interface utilisateur ou la réalisation de tâches répétitives à intervalles réguliers.

 Commencez par importer les modules requis pour votre application.

import sys  ...

Le multithreading en PyQt

1. Introduction

Lorsqu’une application PyQt6 exécute des tâches longues ou intensives, telles que des recherches approfondies ou des calculs complexes, ces opérations peuvent bloquer le thread principal responsable de l’interface utilisateur. En conséquence, l’application peut sembler figée, avec une fenêtre blanche et des widgets non réactifs, offrant une expérience utilisateur dégradée.

Pour maintenir la réactivité de l’application, il est essentiel de déléguer ces tâches lourdes à des threads secondaires. En procédant ainsi, le thread principal continue de gérer l’interface utilisateur, tandis que les opérations intensives s’exécutent en arrière-plan. Cette approche garantit une interface fluide et réactive, même lors de traitements prolongés.

Par exemple, considérons une application qui recherche le terme « PyQt » dans les noms de tous les fichiers d’un disque. Si cette recherche est effectuée dans le thread principal, l’application risque de devenir non réactive. En revanche, en déléguant cette tâche à un thread secondaire, l’interface reste opérationnelle, permettant à l’utilisateur d’interagir avec d’autres fonctionnalités pendant que la recherche se poursuit.

Dans ce chapitre, nous explorerons comment implémenter le multithreading en PyQt6 pour gérer efficacement de telles situations. Nous commencerons par un exemple simple illustrant l’utilisation de la classe QThread, avant de développer une application capable d’effectuer des recherches sur le disque sans compromettre la réactivité de l’interface utilisateur.

2. Illustration de l’utilisation de QThread avec PyQt6

Dans cet exemple pédagogique, nous allons définir un traitement simple consistant à exécuter une tâche d’attente de quelques millisecondes en utilisant la fonction sleep du module Python time. Nous créerons une fenêtre comportant deux boutons :

  • un bouton pour lancer le traitement dans le thread principal de la fenêtre ;

  • un bouton pour lancer le traitement dans un thread dédié.

 Commencez par importer...

Conclusion

En conclusion, le multithreading avec QThreadPool et QRunnable permet d’améliorer les performances et la réactivité des applications PyQt en exécutant plusieurs tâches en parallèle tout en maintenant l’interface graphique fluide. Cette approche simplifie la gestion des threads et permet à l’application de continuer à fonctionner sans blocages, même lors de l’exécution de tâches longues en arrière-plan. Dans le chapitre suivant, nous explorerons des usages plus étendus de PyQt, notamment l’intégration de graphiques et de diagrammes de données avec QtCharts, le web browsing à l’aide de QtWebEngine et les possibilités d’animation et de modélisation 3D pour enrichir vos interfaces et offrir une expérience utilisateur encore plus immersive.