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 完成状态的主要内容,如果未能解决你的问题,请参考以下文章