Python 当QThread具有事件队列时,使用exit()终止线程是否安全?

Python 当QThread具有事件队列时,使用exit()终止线程是否安全?,python,multithreading,qt,pyside,Python,Multithreading,Qt,Pyside,我正在使用QThread做一些定期的后台工作,源代码如下所示 class Worker(QObject): """ Separate QObject that does the work with affinity of 'DoStuffOnceASecond'""" def __init__(self): super(QWorker, self).__init__() def doWork(self): #... do

我正在使用QThread做一些定期的后台工作,源代码如下所示

class Worker(QObject):
    """ Separate QObject that does the work with affinity of 
        'DoStuffOnceASecond'"""
    def __init__(self):
        super(QWorker, self).__init__()

    def doWork(self):
        #... do work, post signal to consumer


class DoStuffOnceASecond(QThread):
    def __init__(self):
        super(DoStuffOnceASecond, self).__init__()   

    def run(self):
        """ Setup "pullFiles" to be called once a second"""
        self.timer= QTimer()
        self.worker = Worker()
        self.timer.setSingleShot(False)
        self.timer.timeout.connect(self.worker.doWork)
        self.timer.start(1000)
        self.exec_()
我正在寻找终止此类线程的最佳方法。一个选项是将一个信号从主线程发送到该线程,在该线程中创建一个插槽。由于这些插槽是作为事件循环的一部分执行的,因此可以安全地拾取它们。但我会自我终结。。。我不确定这是否会很有效

或者我想知道,既然线程应该意识到它正在运行一个事件循环,那么在这个线程上调用
exit()
是否安全呢?这似乎表明这是正常的:

调用此函数后,线程离开事件循环并从对QEventLoop::exec()的调用返回。函数的作用是:返回返回代码

我认为“离开事件循环”意味着它将允许当前事件完成处理。还是QThread立即终止


这里的代码是python(pyside 1.10,python 2.7),但这可以很容易地应用于使用QThread的任何QT代码。

如果不介意返回代码为0,则不需要声明任何额外的插槽。然后您可以使用
quit()
slot,它只调用线程上的
exit(0)
。关于你对“自我终止”的恐惧——你不是在终止线程,只是在退出它的事件循环。您可以通过再次调用exec()随时启动它。你仍然对你的线程很好,所以一切都应该“工作得很好”。当上述方法失败时,即时终止是可能的,但这意味着最后一次绝望的终止线程。

因此答案是“是”,这是安全的。但需要注意的是(就像我刚刚学到的),quit只是告诉事件队列在当前事件完成后停止。它不会阻塞。如果要等待线程作为
quit
调用的结果完成,则需要调用“wait()”。是的,这是一种常见做法。使QWaitCondition可从两个线程访问,并在退出事件循环时执行wakeAll()。但这不是你问题的一部分:——)