Partage de données entre la fenêtre principale et le thread dans PyQt
Les applications multithread doivent souvent partager des données entre le thread de la fenêtre principale et les threads de travail. Pour garantir la sécurité des threads et une communication appropriée, PyQt propose plusieurs approches pratiques.
Option 1 : référence directe à la fenêtre principale
Dans cette approche, une référence à la fenêtre principale la fenêtre est transmise au thread. Le thread peut alors accéder directement aux données de la fenêtre principale, comme la valeur d'une spinbox.
class MainWindow(QtGui.QWidget):
def __init__(self):
# ...
self.worker = Worker(self)
# ...
class Worker(QtCore.QThread):
def __init__(self, host_window):
super(Worker, self).__init__()
self.host = host_window
# ...
Option 2 : Signaux et slots
PyQt utilise des signaux et des slots pour communiquer entre les objets. Dans cette approche, le thread de travail émet des signaux lorsque les données changent, et les fonctions d'emplacement de la fenêtre principale gèrent les mises à jour.
class MainWindow(QtGui.QWidget):
def __init__(self):
# ...
self.worker = Worker()
self.worker.beep.connect(self.update)
# ...
class Worker(QtCore.QThread):
beep = QtCore.pyqtSignal(int)
def __init__(self):
super(Worker, self).__init__()
# ...
Quelle option utiliser ?
Le choix dépend des besoins du thread et du niveau de contrôle requis.
Considérations sur la sécurité des threads
Les widgets ne sont pas thread-safe. Par conséquent, il est crucial d’utiliser des signaux et des slots pour gérer la communication entre le thread et la fenêtre principale. La manipulation directe de widgets à partir de plusieurs threads peut entraîner un comportement inattendu.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3