首页 > 解决方案 > 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();
}

这是输出: 在此处输入图像描述

这是所需的输出: 在此处输入图像描述

编辑

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

任何帮助将不胜感激

标签: qtqeventloop

解决方案


QTimer::singleShot(0, &longFunction);

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


推荐阅读