Qt - 如何在不显式实现线程的情况下同时运行两个插槽

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

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

以上是关于Qt - 如何在不显式实现线程的情况下同时运行两个插槽的主要内容,如果未能解决你的问题,请参考以下文章

如何在不显式编译的情况下让 Visual Studio 错误检查我的代码(显示曲线)?

数组适配器中的 get count() 如何在不显式返回数组大小的情况下返回值?

如果通过 spark-submit 提交作业,我们可以在不显式创建的情况下使用 spark 会话对象吗

使用 Excel 是不是可以在不显式生成表格数据但仅使用公式的情况下绘制图表?

我可以在不显式调用 headObject 的情况下从 S3 对象流中获取 Content-Type 吗?

Qt:如何在不阻塞主线程的情况下播放声音?