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