2017-02-08 3 views
-1

Ich habe gelesen, wie man QThreads "richtig" benutzt und ich bin ein bisschen verwirrt geworden. Ich habe herumgelesen und eine Menge Leute haben dazu gesagt, ein QThread zu erstellen, aber auch einen Worker zu erstellen, der ein QObject ist. Verwenden Sie dann movetoThread, um das Qobject in Qthread zu verschieben.pyqt - Wie stelle ich sicher, dass alle meine Berechnungen in einem separaten Qthread ausgeführt werden?

Ich bin nur ein wenig verwirrt, da all die Beispiele, die ich auf Stackoverflow gesehen habe, das nicht wirklich tun.

Wenn dies mein Code:

class worker(QThread): 
    def __init__(self): 
     Qthread.__init__(self) 

    def run(self): 
     do_work() 
     a = 3 

    def do_work(self): 
     b = 2 

     self.emit(SIGNAL("work_done"),b) 

class MyApp(QtGui.QMainWindow): 
    QtGui.QMainWindow.__init__(self, parent) 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 

     self.worker_thread = worker() 

     self.connect(self.worker,SIGNAL('work_done'),self.done) 

     self.worker_thread.start() 

    def done(self,b) 

     print "the value from the worker is: " + str(b) 

Wird dieser Code macht die Zuordnung von Variablen a und b in einem anderen Thread aus dem Hauptthread TRENNEN getan? Oder ist das nicht wahr, wie mein worker_thread Objekt LEBT INSIDE den Hauptfaden?

Antwort

-1

Eine bessere Methode zum Ausführen von Code in einem anderen Thread ist nicht die Unterklasse QThread, sondern das Objekt, das diesen anderen Code implementiert, in einen separaten Thread zu verschieben.

In Ihrem Fall würde Ihr worker Objekt direkt von QObject erben, so dass Sie über Threads über Signale und Steckplätze mit ihm kommunizieren können. Erstellen Sie dann einen standardmäßigen, vorgefertigten QThread und verschieben Sie den worker dorthin. Verwenden Sie Signale/Slots, um bei Bedarf die Arbeitsdaten zu senden und die Ergebnisse abzurufen, wenn sie bereit sind.

Ich denke, Ihre Verwirrung von dieser Idee stammt: das QThread Objekt schafft einen separaten Thread, aber das Objekt selbst in welchem ​​Thread lebt erstellt das Objekt in dem ersten Platz. Wenn Sie es beispielsweise im Hauptthread erstellen, bedeutet dies, dass QThread ebenfalls im Hauptthread ist, aber Ihr worker Objekt wäre in dem Thread, der von dem QThread Objekt verwaltet wird (nachdem Sie es natürlich dorthin verschoben haben).

Weitere Informationen und Erläuterungen finden Sie unter this post.

+0

Der Beitrag, mit dem Sie verlinkt haben, ist veraltet und wurde von [QThread: Sie tun nicht so falsch] (https://woboq.com/blog/qthread-you-were-not-doing-so-wrong) ersetzt .html). Zusammenfassung: Wenn Sie im Worker-Thread keine Ereignisschleife benötigen (was sehr oft der Fall ist), führen Sie einfach die Unterklasse 'QThread' aus und reimplementieren Sie' run'. – ekhumoro

+0

@ekhumoro Es ist nicht veraltet, es hängt wirklich davon ab, was Sie in dem separaten Thread tun. Wenn Sie nur etwas gekapselten Code ausführen möchten, ist das Unterklassifizieren und erneute Implementieren von 'run()' in Ordnung. Aber wenn Sie ein Objekt haben wollen, mit dem Sie kommunizieren können, ist es besser, den Ansatz zu verwenden, den ich hier gebe. – bnaecker

+0

Nein, es ist wirklich veraltet. Es sagt, dass die offiziellen Qt-Thread-Dokumente falsch sind (was sie nicht mehr sind), und behauptet auch, "zu Unterklasse [QThread] und implementieren Sie Ihre eigene run() -Funktion, ist sehr falsch" - was auch eindeutig falsch ist. Bitte lies den anderen Blog-Beitrag, den ich verlinkt habe, um die Geschichte zu diesem Thema zu verstehen - es ist nicht sehr lang und spiegelt die Empfehlungen in den aktuellen Qt-Dokumenten wider. – ekhumoro

Verwandte Themen