首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用QEventLoop同时等待多个QNetwork应答?

如何使用QEventLoop同时等待多个QNetwork应答?
EN

Stack Overflow用户
提问于 2019-12-05 09:14:51
回答 1查看 290关注 0票数 3

我的函数使用QNetworkAccessManager并发下载多个文件。然后,它应该等待所有QNetworkReply回复完成,然后才能继续执行其余的代码。

然而,我不能让QEventLoop与多个连接一起工作,它要么在所有回复完成之前返回,要么陷入我假设的无限循环中。

这是我的代码:

代码语言:javascript
复制
void DownloadFiles(QStringList urls)
{
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    QEventLoop loop;
    QNetworkReply *replies[6];

    for (int i = 0, i < urls.lenght(); i++){
        replies[i] = manager->get(QNetworkRequest(QUrl(urls[i]));
        connect(replies[i], SIGNAL(finished()), &loop, SLOT(quit()));
    }
    loop.exec();  // Wait here
    // Rest of code
}

另一种尝试,也许更荒谬:

代码语言:javascript
复制
void DownloadFiles(QStringList urls)
{
    QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    QEventLoop loops[6];
    QNetworkReply *replies[6];

    for (int i = 0, i < urls.lenght(); i++){
        replies[i] = manager->get(QNetworkRequest(QUrl(urls[i]));
        connect(replies[i], SIGNAL(finished()), &loops[i], SLOT(quit()));
    }
    for (int i = 0; i < 6; i++)
       loops[i]->exec();  // Wait here
    // Rest of code
}

同样,我的目标是同时下载多个文件,并等待所有文件完成后再继续执行其余代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-05 10:14:40

您可以使用计数器来检查信号被触发了多少次。

代码语言:javascript
复制
#include <QtNetwork>

static void DownloadFiles(const QList<QUrl> & urls){
    QNetworkAccessManager manager;
    QList<QNetworkReply *> replies;
    QEventLoop loop;
    int total = urls.length();
    for(const QUrl & url: urls){
        QNetworkReply *reply = manager.get(QNetworkRequest(url));
        QObject::connect(reply, &QNetworkReply::finished, [&total, &loop](){
            total--;
            if(total == 0){
                loop.quit();
            }
        });
        replies << reply;
    }
    loop.exec();
    for(QNetworkReply *reply: replies){
        qDebug() << "===============================";
        qDebug() << "url:" << reply->url() << "\nhas error?" << (reply->error() != QNetworkReply::NoError);
        qDebug() << "===============================";
    }
    qDebug() << "Completed";
    qDeleteAll(replies.begin(), replies.end());
    replies.clear();
}

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    QList<QUrl> urls { QUrl("https://www.qt.io/"),
                       QUrl("https://github.com/"),
                       QUrl("https://stackoverflow.com/") };
    DownloadFiles(urls);

    return 0;
}

输出:

代码语言:javascript
复制
===============================
url: QUrl("https://www.qt.io/") 
has error? false
===============================
===============================
url: QUrl("https://github.com/") 
has error? false
===============================
===============================
url: QUrl("https://stackoverflow.com/") 
has error? false
===============================
Completed
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59186818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档