2016-09-20 1 views
1

Ich versuche einen Thread zu beenden, nachdem es fertig ist. Ich verwende moveToThread. Ich versuche, den Worker-Thread vom Hauptthread zu trennen, indem ich self.thread.quit() im Slot aufruft. Und das funktioniert nicht.Wie man einen QThread in PyQt5 korrekt beendet, wenn moveToThread verwendet wird

Ich habe mehrere Beispiele zum Starten des Threads mit moveToThread, wie diesem gefunden. Aber ich kann nicht finden, wie man eines aufgibt. Diese

from PyQt5.QtCore import QObject, QThread 
from PyQt5.QtCore import pyqtSlot, pyqtSignal 
from PyQt5.QtWidgets import QMainWindow 

class MainWindow(QMainWindow): 
    def __init__(self): 
     super().__init__() 
     print("Base init") 
     self.start_thread() 

    @pyqtSlot(int) 
    def onFinished(self, i): 
     print("Base caught finished, {}".format(i)) 
     self.thread.quit() 
     print('Tried to quit thread, is the thread still running?') 
     print(self.thread.isRunning()) 

    def start_thread(self): 
     self.thread = QThread() 
     self.w = Worker() 
     self.w.finished1[int].connect(self.onFinished) 
     self.w.moveToThread(self.thread) 
     self.thread.started.connect(self.w.work) 
     self.thread.start() 

class Worker(QObject): 
    finished1 = pyqtSignal(int) 

    def __init__(self): 
     super().__init__() 
     print("Worker init") 

    def work(self): 
     print("Worker work") 
     self.finished1.emit(42) 


if __name__ == "__main__": 
    import sys 
    from PyQt5.QtWidgets import QApplication 

    app = QApplication(sys.argv) 
    mw = MainWindow() 
    mw.show() 

sys.exit(app.exec_()) 

ist die Ausgabe von allen meinen Druckfunktionen (ohne die Farbe natürlich):

Base init 
Worker init 
Worker work 
Base caught finished, 42 
Tried to quit thread, is the thread still running? 
True 

Antwort

0

Versuchen Sie Ihr Skript mehrere Male ausgeführt wird. Ist das Ergebnis des Anrufs immer gleich self.thread.isRunning()? Versuchen Sie, einen Anruf zu time.sleep(1) hinzuzufügen, bevor Sie überprüfen, ob der Thread noch ausgeführt wird. Bemerken Sie einen Unterschied?

Denken Sie daran, dass Sie einen Anruf vom Hauptthread Ihres Programms zu einem anderen Thread tätigen, der per Definition asynchron ist. Ihr Programm wird nicht warten, um sicherzustellen, dass self.thread.quit() abgeschlossen ist, bevor die nächsten Anweisungen ausgeführt werden.

+0

Danke! Du hast recht. Der Thread hörte schließlich auf. print (self.thread.isRunning()) zeigt False nach dem Hinzufügen von time.sleep (1) – squirtgun

Verwandte Themen