Single Worker Thread für alle Aufgaben oder mehrere spezifische Mitarbeiter?

Ich schaffe eine einfache GUI-Anwendung mit PyQt5, wo ich einige Daten von einer API anfordern, die dann verwendet wird, um verschiedene Steuerelemente der Benutzeroberfläche zu füllen.

Die Beispiele, die ich über Worker Threads in PyQt alle scheinen, Unterklasse QThread und dann ihre Geschäftslogik in der überschriebenen run() -Methode. Das funktioniert gut, aber ich möchte verschiedene API-Anrufe zu verschiedenen Zeiten mit einem Arbeiter ausführen.

Also meine Frage ist: Muss ich einen bestimmten Worker-Thread für jede Operation erstellen, die ich machen möchte oder gibt es eine Möglichkeit, eine einzige Thread-Klasse zu haben, die ich verwenden kann, um verschiedene Operationen zu verschiedenen Zeiten durchzuführen und daher den Overhead zu vermeiden Erstellen von verschiedenen Thread-Unterklassen?

2 Solutions collect form web for “Single Worker Thread für alle Aufgaben oder mehrere spezifische Mitarbeiter?”

Was Sie tun können, ist, ein Objekt zu entwerfen, um all diese Aufgaben zu erledigen (QObject für Slots / Signale erben). Lets sagen, jede Aufgabe ist als separate Funktion definiert – können diese Funktionen als Slots bezeichnen.

Dann (eine allgemeine Reihenfolge der Ereignisse):

  • Instanziieren eines QThread-Objekts.
  • Instanziieren Sie Ihre Klasse.
  • Verschieben Sie Ihr Objekt mit YouClass->moveToThread(pThread) in den Thread.
  • Definieren Sie nun ein Signal für jeden Slot und verbinden Sie diese Signale mit den entsprechenden Slots in Ihrem Objekt.
  • pThread->start() den Faden mit pThread->start()

Jetzt kannst du ein Signal ausgeben, um eine bestimmte Aufgabe im Thread zu machen. Sie brauchen nicht zu Unterklasse QThread verwenden Sie einfach eine normale Klasse aus QObject abgeleitet (so dass Sie Slots / Signale verwenden können).

Du kannst entweder eine Klasse in einem Thread verwenden, um viele Operationen zu machen (Notiz: sie werden in die Warteschlange gestellt). Oder mache viele Klassen in vielen Threads (um "parallel" zu laufen).

Ich weiß nicht, python gut genug, um ein Beispiel hier zu versuchen, also werde ich nicht: o

Anmerkung: Der Grund für Unterklasse QThread wäre, wenn du die Funktionalität der QThread-Klasse erweitern wolltest – also mehr / spezifische Thread-Funktionen hinzufügen. QThread ist eine Klasse, die einen Thread steuert und nicht dazu gedacht ist, beliebige / generische Aufgaben auszuführen … auch wenn du es missbrauchen kannst , wenn du es wünschst 🙂

Hier ist ein kurzes Beispiel von einem (aber könnte so viele wie Sie es wünschen) Arbeitnehmerobjekt, das zu einem einzigen laufenden QThread (gestartet) bewegt wird und über Signale kommuniziert. Auch der Faden wird am Ende gestoppt. Es zeigt, was code_fodder in seiner Antwort umrissen hat.

 from PyQt4 import QtCore QtCore.Signal = QtCore.pyqtSignal class Master(QtCore.QObject): command = QtCore.Signal(str) def __init__(self): super().__init__() class Worker(QtCore.QObject): def __init__(self): super().__init__() def do_something(self, text): print('current thread id = {}, message to worker = {}'.format(int(QtCore.QThread.currentThreadId()), text)) if __name__ == '__main__': app = QtCore.QCoreApplication([]) # give us a thread and start it thread = QtCore.QThread() thread.start() # create a worker and move it to our extra thread worker = Worker() worker.moveToThread(thread) # create a master object and connect it to the worker master = Master() master.command.connect(worker.do_something) # call a method of the worker directly (will be executed in the actual thread) worker.do_something('wrong way to communicate with worker') # communicate via signals, will execute the method now in the extra thread master.command.emit('right way to communicate with worker') # start the application and kill it after 1 second QtCore.QTimer.singleShot(1000, app.quit) app.exec_() # don't forget to terminate the extra thread thread.quit() thread.wait(5000) 
  • Das Aufrufen der benutzerdefinierten Klasse in der .ui-Datei schlägt fehl
  • Pyqt Installationsproblem in Mac osx Schneeleopard
  • Login-Dialog PyQt
  • Python - PyQT4 wie man die Mausklickposition irgendwo im Fenster erkennt?
  • Wie gehst du pyqt .ui Code in Python?
  • PyQt Tableview Zeilen Hintergrundfarbe basierend auf Zellenwert
  • Python-Programm stürzt wegen ntdll.dll und QtGui4.dll ab
  • Screenshot von externen Fenster in Windows in Python
  • Drehen - TransformOriginPoint - PyQt4
  • Shiboken kann nicht importiert werden
  • "Muss eine QApplication vor einem QPaintDevice aus QWidget konstruieren
  • Python ist die beste Programmiersprache der Welt.