QEventLoop 仅等待本地事件而不是主循环事件
Posted
技术标签:
【中文标题】QEventLoop 仅等待本地事件而不是主循环事件【英文标题】:QEventLoop wait for only local events not main loop events 【发布时间】:2019-07-08 17:03:19 【问题描述】:我正在尝试执行网络请求并等待响应,然后再继续。虽然使用 QEventLoop 可以等待请求,但问题是如果在程序的其他部分触发了其他信号,它们将首先执行。
这是重现问题的代码示例。您可以看到网络请求(我在这里仅使用http://example.com 为例)显然会在第二个singleShot
计时器触发之前发出。
#include <QApplication>
#include <QTimer>
#include <QDebug>
#include <QNetworkAccessManager>
#include <QNetworkReply>
void longFunction()
qDebug() << "Starting Long Function";
QEventLoop localEventLoop;
QNetworkAccessManager manager;
QNetworkReply *reply = manager.get(QNetworkRequest(QUrl("http://example.com")));
QObject::connect(reply, &QNetworkReply::finished, &localEventLoop, &QEventLoop::quit);
// I wish to block here
// - do not want to pass this point and run
// other events if fired from the main event loop
localEventLoop.exec();
qDebug() << "Finishing Long Function";
int main(int argc, char *argv[])
QCoreApplication a(argc, argv);
QTimer::singleShot(0, &longFunction);
QTimer::singleShot(1, []()
qDebug() << " -- Some other function that was issued after";
qDebug() << " -- 'longFunction' started but before 'longFunction' ended";
);
return a.exec();
这是输出:
这是所需的输出:
编辑
添加更多信息。上面的代码显然是对问题的过度简化,因为我不能轻易发布所有代码。基本上发生的事情是在我的项目中的其他地方有代码会发出一个连接到上面longFunction()
的信号。显然,我想在继续之前等待来自 REST 调用的响应,因为响应将在该函数后面指定元素。问题是在稍后的某个时间点(可能在 REST 调用完成之前),我的代码的其他一些部分可能会触发其他一些信号,我不希望处理这些其他信号。我只想等待处理localEventLoop
上的ONE 连接。
任何帮助将不胜感激
【问题讨论】:
【参考方案1】:QTimer::singleShot(0, &longFunction);
是一个异步函数。它在void longFunction()
执行 QEventLoop 之前返回。结果是您的第二个QTimer::singleShot(1, []()
将立即触发。解决方案是将 QEventLoop 移到您的函数之外,在 QTimer::singleShot(1, []()
【讨论】:
以上是关于QEventLoop 仅等待本地事件而不是主循环事件的主要内容,如果未能解决你的问题,请参考以下文章
关于Qt的事件循环以及QEventLoop的简单使用(QEventLoop::quit()能够终止事件循环,事件循环是可以嵌套的)
QEventLoop等待另外一个事件的停止,非常实用 good