QThread 和 QRunnable 的区别是什么?
何时应该使用 QThread,何时应该使用 QRunnable?
QThread 和 QRunnable 的区别是什么?
何时应该使用 QThread,何时应该使用 QRunnable?
QThread可以运行事件循环,而QRunnable没有,因此不要将其用于设计有事件循环的任务。另外,QRunnable不是QObject,因此没有内置的明确向其他组件传递信息的方法;您必须手动编写使用低级线程原语(例如,使用互斥量保护的队列来收集结果等)的代码。使用QThread,您可以使用线程安全的信号和槽。
QRunnable
类和 QtConcurrent::run()
函数非常适用于这样的情况:我们想要在一个或多个次线程中进行一些后台处理,而不需要使用 QThread 提供的全部功能和灵活性。
来源:《高级 Qt 编程:使用 C++ 和 Qt 4 创建优秀软件》,作者 Mark Summerfield
选择使用QThreadPool还是QThread
Qt框架提供了许多用于多线程的工具。一开始选择正确的工具可能会有挑战性,但实际上,决策树只有两个选项:您要么希望Qt为您管理线程,要么您想自己管理线程。然而,还有其他重要的标准:
不需要事件循环的任务。特别是在任务执行期间未使用信号/槽机制的任务。 使用:QtConcurrent和QThreadPool + QRunnable。
使用信号/槽并因此需要事件循环的任务。 使用:Worker对象移动到+ QThread。