2016-09-20 57 views
1

我试图在完成处理后退出线程。我正在使用moveToThread。我试图通过在槽中调用self.thread.quit()从主线程退出工作线程。这不起作用。如何在使用moveToThread时正确退出PyQt5中的QThread

我发现了几个使用moveToThread启动线程的例子,比如这个。但我找不到如何退出。

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_()) 

这是我所有的打印功能输出(当然没有的颜色):

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

回答

0

尝试运行脚本多次。致电self.thread.isRunning()的结果总是一样吗?在检查线程是否仍在运行之前,尝试添加对time.sleep(1)的调用。注意有什么不同?

请记住,您正在从程序的主线程调用另一个线程,该线程根据定义是异步的。在执行下一条指令之前,您的程序不会等待以确保self.thread.quit()已完成。

+0

谢谢!你是对的。毕竟,线程正在退出。 print(self.thread.isRunning())显示False添加time.sleep(1)后, – squirtgun