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

2024-09-30 08:29:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我用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()是否安全?documentation似乎表示这是正常的:

After calling this function, the thread leaves the event loop and returns from the call to QEventLoop::exec(). The QEventLoop::exec() function returns returnCode.

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

这里的代码是python(pyside1.10,python2.7),但这可以很容易地应用于任何使用QThread的QT代码。在


Tags: thetoselfinitdef事件线程class
1条回答
网友
1楼 · 发布于 2024-09-30 08:29:19

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

相关问题 更多 >

    热门问题