如何在Qt中很好地连接异步网络请求

时间:2015-12-06 12:48:53

标签: c++ qt networking asynchronous

我想发出一系列网络请求(在Qt中),其中一个请求的详细信息取决于最后一个请求的结果。目前我的代码如下所示:

QNetworkReply *reply = m->get(QNetworkRequest(QUrl("http://qt-project.org")));
    reply->connect(reply,&QNetworkReply::finished,[=](){
        //Do something with reply, calculate a value for the next request
        QNetworkReply *reply2 = m->get(QNetworkRequest(QUrl("http://www.google.de")));
        reply->deleteLater();
        reply2->connect(reply2,&QNetworkReply::finished,[=](){
            //Do something with reply2, calculate a value for the next request
            QNetworkReply *reply3 = m->get(QNetworkRequest(QUrl("http://amazon.de")));
            reply2->deleteLater();
            reply3->connect(reply3,&QNetworkReply::finished,[=](){
                //...
            });
        });
    });

虽然这有效,但我发现有两个问题:

  1. 当我想要连接更多请求时,代码变得非常难看。
  2. 我该如何处理错误?我不能用throw。
  3. 所以我正在寻找一种更好地构建此代码的方法。我想到了以下几个选项:

    (1)使用阻塞请求,可以简单地写(伪代码!):

    try {
        ResultType res1 = blockingRequest("http://qt-project.org");
        // Doe something with res1
        ResultType res2 = blockingRequest("http://www.google.com");
        // Doe something with res2
        ResultType res3 = blockingRequest("http://amazon.de");
        // Doe something with res3
    catch(...) {
        // ...
    }
    

    此代码必须在单独的线程中运行。我读到在Qt中很难做到阻塞请求,我宁愿坚持标准的Qt做事方式。

    (2)使用宏或其他一些机制来编写更好看的代码。 我在考虑haskell中的“do”语法。我之前在Haxe用MonadSurprise完成了这个。在Haxe中使用它我可以写:

    MonadSurprise.dO({
        res1 <= request("http://qt-project.org");
        res2 <= request("http://www.google.de");
        res3 <= request("http://amazon.de");
    });
    

    MonadSurprise.dO是一个宏,负责正确处理Surprises(按请求返回)。它还通过停止完整操作并在发生错误时返回错误来处理错误处理。

    但我不知道是否可以在c ++ / qt中完成这样的事情。

0 个答案:

没有答案