gpt4 book ai didi

c++ - QEventLoop 用于同步等待信号

转载 作者:行者123 更新时间:2023-11-30 04:09:12 25 4
gpt4 key购买 nike

我正在使用 Qt5,QCoreApplication。为了允许可读和易于维护的代码,我需要在类/线程 A 中编写一个阻塞方法,它将发出信号,连接到不同线程 B 中的插槽,然后等待答案或超时在线程 B 中异步发生。我一开始一直在思考什么感觉像是一个自然的解决方案:让线程 B 回复一个连接到线程 A 中的槽的信号,然后以某种方式等待它。 QEventLoop 似乎可以为我做到这一点。但我一直在阅读相互矛盾的陈述:这就是模式,但如果可以的话,请避免使用它:-)。我很确定我可以通过在 B 准备就绪时释放的 0 QSemaphore 上阻塞 A 来实现我的目的。这样代码可能不会复杂得多。经验丰富的 Qt 开发人员怎么看?是否有好的解决方案,或者您是否在我的描述中发现了一些有缺陷的分析症状(即您认为我永远不需要做那样的事情吗?:-))?

最佳答案

您可以利用的关键要素是 Qt::BlockingQueuedConnection

此连接类型允许您从插槽传递返回值。您可以在信号槽连接中使用它。您还可以通过 QMetaMethod::invoke/QMetaObject::invokeMethod 机制直接调用槽而不使用信号。

#include <QDebug>
#include <QThread>
#include <QCoreApplication>

class Master : public QObject {
Q_OBJECT
public:
Q_SIGNAL bool mySignal();
Q_SLOT void process() {
if (mySignal()) { // this can be a blocking call
qDebug() << "success!";
}
thread()->quit();
}
};

class Slave : public QObject {
Q_OBJECT
public:
Q_SLOT bool mySlot() {
// do whatever processing is needed here
// It's OK to call QCoreApplication::processEvents here
return true;
}
};

int main(int argc, char** argv) {
QCoreApplication app(argc, argv);
QThread masterThread, slaveThread;
Master master;
Slave slave;
master.moveToThread(&masterThread);
slave.moveToThread(&slaveThread);
slave.connect(&master, SIGNAL(mySignal()), SLOT(mySlot()),
Qt::BlockingQueuedConnection);
masterThread.start();
slaveThread.start();
QMetaObject::invokeMethod(&master, "process");
masterThread.wait();
slaveThread.quit();
slaveThread.wait();
return 0;
}

#include "main.moc"

关于c++ - QEventLoop 用于同步等待信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21416487/

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