QEventLoop仅等待本地事件,不等待主循环事件

时间:2019-02-14 15:52:42

标签: qt qeventloop

我正在尝试执行网络请求并等待响应,然后再继续。使用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();
}

这是输出: enter image description here

这是所需的输出: enter image description here

修改

添加更多信息。上面的代码显然是问题的过度简化,因为我无法轻松地发布所有代码。基本上,发生的事情是我项目中其他地方的代码将发出与上方longFunction()相关的信号。显然,我想在继续之前等待来自REST调用的响应,因为响应将在该函数的后面指示元素。问题是,在稍后的某个时刻(可能在REST调用完成之前),我代码的其他部分可能会触发其他信号,而我不希望这些其他信号得到处理。我只想等待localEventLoop上的ONE连接被处理。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

QTimer::singleShot(0, &longFunction);

是一个异步函数。它在void longFunction()执行QEventLoop之前返回。结果是您的第二个QTimer::singleShot(1, []() {将立即触发。解决方案是在QTimer::singleShot(1, []() {

之前将QEventLoop移出函数