【问题标题】:Qt- how to run two slots simultaneously without explicitly implementing threadsQt - 如何在不显式实现线程的情况下同时运行两个插槽
【发布时间】:2016-08-31 13:16:35
【问题描述】:

我有两个连接到同一个信号的 Qt 插槽。

我必须在不显式使用 Qt 多线程的情况下并行运行它们。

我搜索了 Qt 是否提供了隐含的解决方案,但我没有找到。

在 Qt 中有什么解决方案吗?

【问题讨论】:

  • 不。并行 = 多线程。如果你没有多线程,那么你就不能并行处理。
  • 投票决定关闭,因为不清楚。并行运行它们而不并行运行它们?此外,即使 with 线程,您也不能保证它们实际上是并行运行的。如果您使用的是单线程 CPU,或者操作系统只为您的程序分配一个内核,该怎么办?
  • @MSalters:你可以写一个完整的答案,我会打勾并点赞。许多 Qt 用户可能会遇到这个问题。
  • 如上所述,如果没有多线程,您将无法并行运行任何东西。如果“不使用多线程”是指“每个插槽在单独的线程中,但不使用和继承 QThread”,那么有一个非常简单的解决方案
  • @BeardedBeaver:是的,这就是我想要的。我重新编辑了这个问题

标签: c++ multithreading visual-studio qt


【解决方案1】:

您需要将信号连接到slot() 并使用QtConurrent 完成所有工作

#include <QtConcurrent>
#include <QFuture>
...
void MyClass::slot()
{
    QFuture <void> future1, future2;
    future1 = QtConcurrent::run(this,&MyClass::slot1);
    future2 = QtConcurrent::run(this,&MyClass::slot2);
    future1.waitForFinished();
    future2.waitForFinished();
}

您需要使用并发模块。在.pro 文件中,添加:

QT += concurrent

【讨论】:

  • 变化:只有两个插槽,一个QtConcurrent::run 调用slot2slot1 的开头。然后做slot1的正常工作,在slot1的末尾你调用waitForFinishedslot2的未来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2012-02-08
  • 2012-12-04
  • 2018-06-02
相关资源
最近更新 更多