Maison  >  Article  >  développement back-end  >  Comment partager des données en toute sécurité entre la fenêtre principale et les threads de PyQt ?

Comment partager des données en toute sécurité entre la fenêtre principale et les threads de PyQt ?

DDD
DDDoriginal
2024-10-26 17:35:02988parcourir

How Do You Safely Share Data Between PyQt's Main Window and Threads?

Dans PyQt, partage de données entre la fenêtre principale et les threads

Lors de la création d'applications GUI avec PyQt, il peut y avoir des cas où vous devez partager données entre la fenêtre principale et un thread. Pour y parvenir, il est important de se rappeler que les widgets ne sont pas thread-safe. Seul le thread principal peut interagir directement avec les widgets.

Pratiques incorrectes

  • Passer une référence de fenêtre hôte à un thread : Cela permet le thread pour accéder aux données de la fenêtre principale, ce qui peut conduire à des opérations non sécurisées pour les threads.
  • Maintenir une copie synchronisée : Conserver une copie des données dans le thread et la synchroniser avec le thread principal la fenêtre via des signaux ajoute de la complexité et introduit des conditions de concurrence potentielles.
  • Utilisation de variables globales : Bien que techniquement réalisables, les variables globales peuvent entraîner des problèmes de dépendance au code et rendre le code plus difficile à maintenir.

Bonne pratique : signaux et emplacements

L'approche recommandée pour le partage de données consiste à utiliser le mécanisme d'emplacement de signal de Qt. Des signaux sont émis par des objets pour avertir d'autres objets d'un événement spécifique. Les slots sont des fonctions qui reçoivent ces signaux et sont exécutées dans le thread principal.

Exemple : Contrôler le temps de veille à partir d'une Spinbox

Considérons un exemple où un thread effectue une tâche répétitive. tâche et doit ajuster son temps de veille en fonction d'une valeur de spinbox contrôlée par l'utilisateur dans la fenêtre principale.

<code class="python"># In the main window:

# Create worker thread
worker = Worker(spinbox.value())

# Connect the worker's beep signal to an update slot
worker.beep.connect(self.update)

# Connect the spinbox valueChanged signal to worker's update_value slot
spinbox.valueChanged.connect(worker.update_value)


class Worker(QtCore.QThread):
    beep = QtCore.pyqtSignal(int)

    def __init__(self, sleep_time):
        super(Worker, self).__init__()
        self.running = False
        self.sleep_time = sleep_time

    def run(self):
        # Thread execution logic here...

    def update_value(self, value):
        self.sleep_time = value</code>

Dans cet exemple, l'emplacement update_value du fil met à jour son attribut sleep_time chaque fois que la valeur de spinbox de la fenêtre principale change. Cela permet au thread d'ajuster dynamiquement son temps de veille en fonction des entrées de l'utilisateur. Le sleep_time mis à jour est ensuite utilisé dans la méthode d'exécution du thread pour contrôler la durée de veille entre chaque répétition de tâche.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn