Ich erstelle eine PYQT6 -Anwendung, die eine Sequenz im Hintergrund ausführen kann. Die Sequenz ist eine Unterklasse von QObject mit einer Run () -Methode, die von einem QThread aufgerufen wird. Hier ist das Problem: Die Sequenz kann keine Signale empfangen. Es gibt Signale für eine Pause, Unpause und Stornierung. Wenn ich die Sequenz starte, verlinke ich diese Signale mit Schaltflächen im Hauptfaden. Das Drücken dieser Tasten tut jedoch nichts. Die Schaltflächensignale sind ordnungsgemäß emittiert, aber der Worker -Thread empfängt sie nie. Bei all meiner Suche habe ich zwei Lösungen gefunden: (1) Verwenden Sie einen Qtimer , um Ereignisse im Arbeiter auszuführen, anstatt in einer Weile Loop, so dass die Ereignisschleife nicht blockiert ist, oder (2) qcoreApplication aufrufen. Mach es, wenn es der einzige Weg ist. Ich habe gehört, dass die zweite Option eine schlechte Übung ist, weil sie möglicherweise nicht sicher thread ist (ich bin mir darüber immer noch nicht sicher), aber ich könnte es tun, weil ich sowieso häufig zwischen den Sequenzaktionen warte. Könnte ich beispielsweise nur Ereignisse im Worker -Thread verarbeiten, nicht in der gesamten Anwendung?
Ich erstelle eine PYQT6 -Anwendung, die eine Sequenz im Hintergrund ausführen kann. Die Sequenz ist eine Unterklasse von QObject mit einer Run () -Methode, die von einem QThread aufgerufen wird. Hier ist das Problem: Die Sequenz kann keine Signale empfangen. Es gibt Signale für eine Pause, Unpause und Stornierung. Wenn ich die Sequenz starte, verlinke ich diese Signale mit Schaltflächen im Hauptfaden. Das Drücken dieser Tasten tut jedoch nichts. Die Schaltflächensignale sind ordnungsgemäß emittiert, aber der Worker -Thread empfängt sie nie. Bei all meiner Suche habe ich zwei Lösungen gefunden: (1) Verwenden Sie einen Qtimer , um Ereignisse im Arbeiter auszuführen, anstatt in einer Weile Loop, so dass die Ereignisschleife nicht blockiert ist, oder (2) qcoreApplication aufrufen. Mach es, wenn es der einzige Weg ist. Ich habe gehört, dass die zweite Option eine schlechte Übung ist, weil sie möglicherweise nicht sicher thread ist (ich bin mir darüber immer noch nicht sicher), aber ich könnte es tun, weil ich sowieso häufig zwischen den Sequenzaktionen warte. Könnte ich beispielsweise nur Ereignisse im Worker -Thread verarbeiten, nicht in der gesamten Anwendung?[code]import sys import time from PyQt6.QtCore import Qt, pyqtSignal, QObject, QThread, QReadLocker, QWriteLocker, QReadWriteLock from PyQt6.QtWidgets import ( QApplication, QLabel, QMainWindow, QPushButton, QVBoxLayout, QWidget, )
class Worker(QObject): finished = pyqtSignal() progress = pyqtSignal(int)
def run(self): """Long-running task.""" for i in range(10): # this gets properly processed. Why? self.progress.emit(i) time.sleep(1) with QReadLocker(self.mutex): if self.canceled: break while True: with QReadLocker(self.mutex): if not self.paused: break time.sleep(0.1)
self.finished.emit()
def cancel(self): # this never runs with QWriteLocker(self.mutex): self.canceled = True
def pause(self): # this never runs with QWriteLocker(self.mutex): self.paused = True
def unpause(self): # this never runs with QWriteLocker(self.mutex): self.paused = False
class Window(QMainWindow): def __init__(self, parent=None): super().__init__(parent) self.clicksCount = 0 self.setupUi()
Ich habe ein Programm mit einer Warteschlange und einem Worker -Thread, der alles in der Warteschlange ausführt. Wenn der Thread fertig ist, sollte er einige Daten ausgeben. Es heißt, es wird...
Wie senden und empfangen Sie Nachrichten mit Pythons Asyncio und der WebSockets -Bibliothek?
Ich verwende Django -Kanäle als Socket -Server. Im Grunde versuche ich also, diesen Socket -Server zu...