QThread 完成状态

Posted

技术标签:

【中文标题】QThread 完成状态【英文标题】:QThread finished state 【发布时间】:2017-05-05 19:58:37 【问题描述】:
QThread * thread = new QThread();
qDebug() << "Finished: " << thread->isFinished();

控制台是:

Finished: 0

线程从未启动,isFinished() 不应该返回 true (1) 而不是 false (0) 吗?

注意:isRunning 返回 0 并且是正确的。

【问题讨论】:

查看源代码,构造函数将finished设置为false。 QThreadPrivate::QThreadPrivate(QThreadData *d) : QObjectPrivate()、running(false)、finished(false)、isInFinish(false)、interruptRequested(false)、exited(false)、returnCode(-1)、stackSize(0)、 priority(QThread::InheritPriority), data(d) 这是 Qt 4.8 源代码的链接(5.6 与此相同)github.com/qt/qt/blob/4.8/src/corelib/thread/qthread.cpp 这就是我的怀疑。当线程第一次启动时,**isFinished()**开始返回正确的值 开始返回正确的值我从线程的构造上说它是正确的。 【参考方案1】:

没有。完成状态表明在此之前 quit()exit() 已被调用。它是接收finished() 信号的替代方法。

quit()exit() 导致run()(这是线程中唯一实际在单独线程中运行的部分)返回到您的QThread 实例所属的线程。之后执行清理过程 - 指定删除事件之外的事件将无法再处理。

已触发完成状态,您可以安全地删除 QThread 的实例。发出finished() 信号(在大多数情况下,连接到位于单独线程中的对象的deleteLater() 插槽)并且isFinished() 返回true

如果您还没有启动线程,它自然无法完成,因为它从未运行过。 :D 开个玩笑,删除一个根本没有启动的QThread 实例是完全安全的。

如果您对此更感兴趣,我建议您查看QThread 的源代码,了解该类的结构和实现方式。

【讨论】:

好的,我现在明白完成状态代表什么。我的猜测是 Finished 状态相当于 Not Running,但它是不同的。【参考方案2】:

来自the documentation:

bool QThread::isFinished() const

如果线程结束返回true;否则返回 false。

另见 isRunning()。

bool QThread::isRunning() const

如果线程正在运行,则返回 true;否则返回 false。

另见 isFinished()。

要完成线程,它必须事先启动。

【讨论】:

从第一条评论开始:finished(false) 在构造函数中设置为 false。我认为它应该设置为true? 我认为应该设置为true 这部分是错误的/与文档和源代码不一致。除非线程实际开始并结束,否则不应将其设置为 true。

以上是关于QThread 完成状态的主要内容,如果未能解决你的问题,请参考以下文章

唤醒一个处于睡眠状态的 QThread?

等待QThread时UI会阻塞/如何正确使用QThread

完成后如何自动退出PyQT QThread?

如何保护 QThread 函数,使其在完成之前的工作之前不会再次被调用?

如何终止 QThread?

PyQt:如何终止可重用的 QThread