Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在Qt中处理异步网络请求_C++_Qt_Networking_Asynchronous - Fatal编程技术网

C++ 如何在Qt中处理异步网络请求

C++ 如何在Qt中处理异步网络请求,c++,qt,networking,asynchronous,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

我想发出一系列网络请求(在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) 使用阻塞请求,可以简单地编写(伪代码!):

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

    (2) 使用宏或其他机制来编写外观更好的代码。 我在考虑haskell中的“do”语法。我以前在哈克斯做过这件事。在Haxe中使用此选项,我可以编写:

    MonadSurprise.dO({
        res1 <= request("http://qt-project.org");
        res2 <= request("http://www.google.de");
        res3 <= request("http://amazon.de");
    });
    
    MonadSurprise.dO({
    
    res1实现异步信号/插槽机制来发送和接收请求。使用状态变量告诉您当前正在处理的请求。在插槽中,还可以请求
    发送方()
    @owacoder你能详细说明一下吗?我看不出这会如何简化代码…@Nathan-在初始化请求链和最后一个请求完成时创建一个名为的插槽。检查最后一个请求的回复,并相应地启动一个新的。这将请求链简化为一个
    replyFinished
    函数,而不是嵌套
    if
    s的d。
    MonadSurprise.dO({
        res1 <= request("http://qt-project.org");
        res2 <= request("http://www.google.de");
        res3 <= request("http://amazon.de");
    });