C++/Qt - QThread 与 QRunnable

Posted

技术标签:

【中文标题】C++/Qt - QThread 与 QRunnable【英文标题】:C++/Qt - QThread vs QRunnable 【发布时间】:2013-05-23 09:51:50 【问题描述】:

QThreads 和 QRunnable 有什么区别?

什么时候应该使用 QThread,什么时候使用 QRunnable?

【问题讨论】:

在 Qt DevDays 2011 上对 Qt 中的多线程进行了很好的讨论(他们解释了 QThread、QRunnable、QThreadPool、跨线程信号槽等)。视频可以在这里找到:@987654321 @, Part 2. @leemes 链接目标不见了 :( 【参考方案1】:

在使用 QThreadPool 和 QThread 之间进行选择 Qt 框架为多线程提供了许多工具。选择正确的工具起初可能具有挑战性,但事实上,决策树仅包含两个选项:您要么希望 Qt 为您管理线程,要么您希望自己管理线程。但是,还有其他重要标准:

不需要事件循环的任务。具体来说,任务执行过程中不使用信号/槽机制的任务。 使用:QtConcurrent 和 QThreadPool + QRunnable。

使用信号/槽并因此需要事件循环的任务。 使用:Worker 对象移动到 + QThread。

Refer the link for detailed description: nice read on qt threading

【讨论】:

【参考方案2】:

QThread 可以运行事件循环,QRunnable 没有,因此不要将它用于设计为具有事件循环的任务。此外,不是 QObject,QRunnable 没有内置的方式来显式地与其他组件通信。您必须使用低级线程原语(例如用于收集结果的互斥保护队列等)手动编写代码。使用 QThread,您可以使用线程安全的信号和插槽。

【讨论】:

【参考方案3】:

QRunnable 类和QtConcurrent::run() 函数非常适合我们希望在一个或多个中执行一些后台处理的情况 辅助线程,而不需要提供的全部功能和灵活性 Q线程。

来自 Mark Summerfield 的“高级 Qt 编程:使用 C++ 和 Qt 4 创建出色的软件

【讨论】:

如果它解释了“QThread 提供的全部功能和灵活性”,这个答案将会很有用,因为它建议您应该默认使用 QRunnable,并且仅在需要时才使用 QThread……什么?信号?事件循环?等等。

以上是关于C++/Qt - QThread 与 QRunnable的主要内容,如果未能解决你的问题,请参考以下文章

QT事件循环与QThread类的关闭quit(),wait()

Qt QThread与QObject的关系

帮助 QT 编程与 QThread 类,如何使用它

Qt系列文章之二十八(基于QThread多线程概述)

Qt系列文章之二十八(基于QThread多线程概述)

Qt线程间的信号与槽 以及 QThread