如何在使用moveToThread时正确退出PyQt5中的QThread
问题描述:
我试图在完成处理后退出线程。我正在使用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
答
尝试运行脚本多次。致电self.thread.isRunning()
的结果总是一样吗?在检查线程是否仍在运行之前,尝试添加对time.sleep(1)
的调用。注意有什么不同?
请记住,您正在从程序的主线程调用另一个线程,该线程根据定义是异步的。在执行下一条指令之前,您的程序不会等待以确保self.thread.quit()
已完成。
谢谢!你是对的。毕竟,线程正在退出。 print(self.thread.isRunning())显示False添加time.sleep(1)后, – squirtgun