C++/Qt - QThread与QRunnable的区别

18

QThread 和 QRunnable 的区别是什么?

何时应该使用 QThread,何时应该使用 QRunnable?


1
在Qt DevDays 2011上,有一个非常好的关于多线程的演讲(他们解释了QThread、QRunnable、QThreadPool、跨线程信号槽等) 。视频可以在这里找到:第一部分第二部分 - leemes
2
@leemes,链接目标已经消失了 :( - d.Candela
3个回答

14

QThread可以运行事件循环,而QRunnable没有,因此不要将其用于设计有事件循环的任务。另外,QRunnable不是QObject,因此没有内置的明确向其他组件传递信息的方法;您必须手动编写使用低级线程原语(例如,使用互斥量保护的队列来收集结果等)的代码。使用QThread,您可以使用线程安全的信号和槽。


10

QRunnable 类和 QtConcurrent::run() 函数非常适用于这样的情况:我们想要在一个或多个次线程中进行一些后台处理,而不需要使用 QThread 提供的全部功能和灵活性。

来源:《高级 Qt 编程:使用 C++ 和 Qt 4 创建优秀软件》,作者 Mark Summerfield


17
如果这个回答能够解释QThread提供的“全面的功能和灵活性”,那么它会很有用,因为它建议默认使用QRunnable,并仅在需要时使用QThread...什么?信号?事件循环?等等。 - Oliver

3

选择使用QThreadPool还是QThread
Qt框架提供了许多用于多线程的工具。一开始选择正确的工具可能会有挑战性,但实际上,决策树只有两个选项:您要么希望Qt为您管理线程,要么您想自己管理线程。然而,还有其他重要的标准:

不需要事件循环的任务。特别是在任务执行期间未使用信号/槽机制的任务。 使用:QtConcurrent和QThreadPool + QRunnable。

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

请参考链接以获取详细描述:有关qt线程的良好阅读


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接