2016-11-09 1 views
0

Ich habe versucht, so viel wie möglich über PyQt4 QThread und die Idee des Worker-Thread zu lesen. Meine Frage ist, anstatt eine QThread-Klasse zu erstellen, um alles darin aus dem durch den blahblah.start() Befehl auszuführen, gibt es eine Möglichkeit, diese individuelle Thread-Klasse zu erstellen, die 4 Funktionen hat und Sie nur Funktion 2 aufrufen und dann den Thread schließen gleich nach?Können Sie eine separate QThread-Klasse erstellen und nur eine bestimmte Funktion daraus aufrufen?

Antwort

2

Subclassing QThread ist eine Praxis, die im Allgemeinen discouraged obwohl oft verwendet wird. [siehe Kommentar unten]

Meiner Meinung nach ist this ein gutes Beispiel dafür, wie man einen Thread in pyqt verwendet. Sie würden einen Worker und einen Thread erstellen, wobei der Worker eine allgemeine Klasse vom Typ QObject ist und der Thread ein QThread ist, dem Sie keine Unterklasse zuordnen. Sie würden dann den Arbeiter zur Bedrohung bewegen und ihn starten.

Innerhalb der Worker können Sie tun, was Sie wollen, es kann beliebig viele Methoden und so weiter haben.
Die eine große Sache zu beachten ist, dass der Arbeiter von der Hauptschleife getrennt sein muss. Daher sollten die Methoden nichts zurückgeben, was in der Hauptschleife verwendet wird (besser gar nichts zurückgeben), und die Ergebnisse des Arbeiters sollten unter Verwendung von Signalen und Zeitschlitzen gesammelt werden.

self.button_start.clicked.connect(self.worker.startWork) 
self.button_do_something_else.clicked.connect(self.worker.function2) 
self.worker.signalStatus.connect(self.updateStatus) 

Auch stellen Sie sicher, dass alle Objekte PyQt/GUI innerhalb der Arbeiter nicht zu verwenden, da dies auch eine Brücke zwischen Arbeiter und Hauptschleife durch PyQt selbst bauen würde.

+0

Unterklasse 'QThread' wird nicht abgeraten. Die aktuelle [Qt-Dokumentation] (http://doc.qt.io/qt-4.8/qthread.html#details) verwendet beide Ansätze. Der Blogeintrag, mit dem Sie verlinkt haben, ist jetzt veraltet, da er sich auf ältere Dokumente bezieht, die neu geschrieben wurden. Weitere Informationen finden Sie [in diesem Blogbeitrag] (http://woboq.com/blog/qthread-you-were-not-doing-so-wrong.html). – ekhumoro

+0

@ekhumoro Einverstanden, obwohl ich finde, dass Subclassing immer noch gefährlich ist, zumindest für Leute wie mich, die nicht mit jeder Nuance des PyQt-Universums vertraut sind. – ImportanceOfBeingErnest

+1

Unterklasse ist nie gefährlich. Die wahren "Gefahren" beim Multithreading entstehen dadurch, dass die Fadensicherheit nicht gewährleistet ist. In Qt bedeutet dies oft, dass man versucht, GUI-Operationen außerhalb des Hauptthreads durchzuführen. Es gibt kein Ende von SO Fragen zu diesem speziellen Thema ... – ekhumoro

Verwandte Themen