Daten zwischen Hauptfenster und Thread in PyQt-Anwendungen teilen
Threads sind nützlich, um Aufgaben auszuführen, ohne das Hauptfenster zu blockieren. Der Zugriff auf Daten aus dem Hauptfenster innerhalb eines Threads stellt jedoch eine Herausforderung dar. Lassen Sie uns die geeignete Methode für den Datenaustausch mit PyQt untersuchen.
Ineffiziente Methoden:
1. Übergeben eines Fensterverweises an Thread:
Dies ermöglicht zwar den direkten Zugriff auf Hauptfenstervariablen, verstößt jedoch gegen Thread-Sicherheitsprinzipien. Widgets sind nicht reentrant und sollten nur vom Hauptthread aus aufgerufen werden.
2. Aufrechterhaltung Thread-synchronisierter Variablenkopien:
Diese Methode erfordert eine häufige Datensynchronisierung, was zu Codekomplexität und potenziellen Race-Bedingungen führt.
3. Verwendung globaler Variablen:
Globale Variablen werden in Multithread-Umgebungen nicht empfohlen. Der gleichzeitige Zugriff auf sie kann zu unvorhersehbaren Ergebnissen führen.
Empfohlene Methode:
Verwenden von Signalen und Slots:
Dies ist der empfohlene Ansatz in PyQt . Signale und Slots bieten einen Thread-sicheren Mechanismus für die Kommunikation zwischen Threads. Die folgenden Schritte beschreiben, wie Signale und Slots für die Datenfreigabe verwendet werden:
1. Signal im Worker-Thread erstellen:
# in worker thread
class Worker(QtCore.QThread):
...
# Create signal named "beep"
beep = QtCore.pyqtSignal(int)
2. Signal vom Worker-Thread ausgeben:
# in worker thread
def run(self):
...
# emit "beep" signal with current count
self.beep.emit(count)
3. Steckplatz mit Signal im Hauptfenster verbinden:
# in main window
self.worker = Worker(self.spinbox.value())
self.worker.beep.connect(self.update) # update槽函数
4. Slot-Funktion im Hauptfenster implementieren:
# in main window
def update(self, count):
...
# update GUI elements using count
5 aktualisieren. Freigegebene Daten aus dem Hauptfenster aktualisieren:
# in main window
self.spinbox.valueChanged.connect(self.worker.update_value) # update_value槽函数
6. Implementieren Sie die Slot-Funktion im Worker-Thread:
# in worker thread
class Worker:
...
def update_value(self, value):
# Update sleep time in worker thread
Durch Befolgen dieser Schritte können Sie Daten zwischen einem Thread und dem Hauptfenster in PyQt-Anwendungen sicher und effizient austauschen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3