线程脚本不会终止

时间:2018-10-02 12:14:31

标签: python-3.x pyqt pyqt5

我是PyQt5新手。我编写了以下代码,这些代码在理想情况下应该终止。

from PyQt5.QtCore import QCoreApplication, pyqtSignal, QObject
import sys
import thread

class MainWindow(QObject):    
    def __init__(self):
        super().__init__()
        self.myMethod()        

    def myMethod(self):
        self.myThread = thread.MainWindow(self)
        self.myThread.threadTerminate.connect(self.finished)
        self.myThread.start()

    def finished(self, arg1):
        print("Message recieved is "+arg1)
        QCoreApplication.quit()

if __name__ == '__main__':    
    qApp = QCoreApplication(sys.argv)
    w = MainWindow()
    qApp.exec_()

线程代码是:

from PyQt5.QtCore import QThread, QCoreApplication, pyqtSignal
import sys
import time

class MainWindow(QThread):
    threadTerminate = pyqtSignal(bool)
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.itsOver = False

    def run(self):
        print("Hello World!")
        time.sleep(3)
        print("Alice")
        time.sleep(4)
        print("Bob")
        time.sleep(4)
        self.stop()

    def stop(self):
        print("About to terminate....")
        self.itsOver = True
        self.threadTerminate.emit(self.itsOver)
        self.terminate()  

我在做什么错?有什么方法可以跟踪程序的执行流程并知道变量的状态?

1 个答案:

答案 0 :(得分:1)

似乎您的比赛条件简单。

当我在对time.sleep(1)self.threadTerminate.emit的调用之间添加self.terminate时,程序将按预期完成(除了您的print语句(自然不能将str和bool串联))。

在不知道Qt如何处理信号/插槽流的确切细节的情况下,我想说您对terminate的调用会在调用{{1 }}的线程,从而从事件循环中删除MainWindow事件,并跳过对finished的调用。

简而言之:在QThread中执行Quit()。这是self.exit()的正常关闭替代方法,据我所知,您应该尽可能避免使用它。


作为旁注,也许需要重新考虑模块和类的命名。 terminate模块是Python2中的模块,在Python3中重命名为thread。首先,这让我感到困惑(与上面的评论者相同),因为您有一个名为“ thread.py”的模块。此外,_thread类似于MainWindow的名称,而PyQt5.QtWidgets.QMainWindow没有“窗口”。