gpt4 book ai didi

c++ - QtConcurrent::run 发出信号

转载 作者:行者123 更新时间:2023-12-02 01:50:54 28 4
gpt4 key购买 nike

我想在 Qt 中从我使用 QtConcurrent::run 调用的函数发出信号

这可能吗?看来我的槽位永远不会被调用。所有信号、槽和函数都是同一类对象的一部分。我尝试在主线程和从线程中建立连接。我并不关心信号和槽是否在同一个线程中,我只是想让它发生。

谢谢

最佳答案

下面的代码在 Qt 4.8.7 中工作得很好。信号从工作线程发出,并在主线程中消耗。我们断言槽在主线程中运行,仿函数在工作线程中运行。

// https://github.com/KubaO/stackoverflown/tree/master/questions/concurrent-emit-qt4-7114421
#include <QtCore>

class Helper : public QObject {
Q_OBJECT
public:
int n = 0;
Q_SLOT void increment() {
Q_ASSERT(QThread::currentThread() == qApp->thread());
n++;
}
};

int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
Helper helper;
Q_ASSERT(helper.n == 0);
QtConcurrent::run([&]{
Q_ASSERT(QThread::currentThread() != qApp->thread());
QObject src;
QObject::connect(&src, SIGNAL(destroyed(QObject*)), &helper, SLOT(increment()));
QObject::connect(&src, SIGNAL(destroyed(QObject*)), &app, SLOT(quit()));
});
app.exec();
Q_ASSERT(helper.n == 1);
}

#include "main.moc"

在 Qt 5 中,您不需要帮助程序类来证明它的工作原理:

#include <QtConcurrent>

int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
int n = 0;
Q_ASSERT(n == 0);
QtConcurrent::run([&]{
Q_ASSERT(QThread::currentThread() != qApp->thread());
QObject src;
QObject::connect(&src, &QObject::destroyed, &app, [&]{
Q_ASSERT(QThread::currentThread() == qApp->thread());
n ++;
qApp->quit();
});
});
app.exec();
Q_ASSERT(n == 1);
}

关于c++ - QtConcurrent::run 发出信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7114421/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com