【发布时间】: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 连接。
任何帮助将不胜感激
【问题讨论】:
标签: qt qeventloop