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?
Können Sie eine separate QThread-Klasse erstellen und nur eine bestimmte Funktion daraus aufrufen?
Antwort
Subclassing [siehe Kommentar unten]QThread
ist eine Praxis, die im Allgemeinen discouraged obwohl oft verwendet wird.
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.
- 1. Können Sie ein Array mit mehreren Objekten festlegen und eine Methode daraus aufrufen?
- 2. Wie können Sie eine externe JavaScript-Funktion in eine react-Komponente einbetten und aufrufen?
- 3. Dynamisch CheckBox erstellen und eine Funktion mit Onchange-Ereignis aufrufen
- 4. wie eine bestimmte Funktion auf jeder Ajax Anfrage aufrufen
- 5. Socket.io erstellen eine separate Event-Handler-Datei
- 6. WP Plugin-Funktion nur aufrufen, wenn bestimmte Bedingung erfüllt ist
- 7. Eine Funktion nur über eine andere Funktion zugänglich machen
- 8. Eine Funktion in foreach aufrufen?
- 9. php bestimmte HTML-Elemente aufrufen und eine Bedingung machen
- 10. Systemzeit immer überprüfen und eine Funktion aufrufen
- 11. Wie eine Funktion aufrufen und Variablen zurückgeben
- 12. Können Sie eine Funktion in TypeScript erweitern?
- 13. So erstellen Sie eine Funktion
- 14. Erstellen Sie eine Funktion, die
- 15. JavaScript Idiom: Erstellen Sie nur eine Funktion aufzurufen es
- 16. Eine Funktion nur einmal in x Sekunden aufrufen
- 17. Wie können Sie eine eindeutige Seriennummer für eine bestimmte Zeichenfolge erstellen?
- 18. Warum können Sie eine Methode aufrufen, bevor sie definiert wurde?
- 19. eine Datei erstellen und bestimmte Daten herausnehmen
- 20. Können Sie während einer Kompilierung nur bestimmte Formulare einschließen?
- 21. Eine Funktion parallel aufrufen C++
- 22. JQuery: Eine Funktion dynamisch aufrufen
- 23. Macht es eine Umleitung sinnvoll, indem Sie eine separate Seite aufrufen?
- 24. Wie bestimmte Zellen eine VBA-Funktion ausblenden?
- 25. Wie Sie eine Mathematica-Funktion in Matlab aufrufen?
- 26. C#, StringToEnum, kann ich daraus eine generische Funktion machen
- 27. Dynamisch eine statische Funktion aufrufen?
- 28. php - eine Funktion dynamisch aufrufen
- 29. Sie können eine Methode für einen nullwertigen Ausdruck nicht aufrufen.
- 30. Funktion, die eine bestimmte Funktion aufruft
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
@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
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