使用moveToThread

时间:2016-09-20 10:52:01

标签: multithreading python-3.x pyqt pyqt5 qthread

我正在尝试在完成处理后退出一个线程。我正在使用moveToThread。我试图通过调用插槽中的self.thread.quit()从主线程退出工作线程。这不起作用。

我找到了几个使用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

1 个答案:

答案 0 :(得分:1)

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

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