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

QThreads 和 QRunnable 有什么区别?

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

【问题讨论】:

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

标签: c++ qt concurrency qthread


【解决方案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……什么?信号?事件循环?等等。
      猜你喜欢
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 2021-12-25
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多