简体   繁体   English

Qt QNetworkAccessManager 为什么我不能在同一个主线程中并行发送超过 1 个 http 请求

[英]Qt QNetworkAccessManager why i can’t send more then 1 http request in parallel in the same main thread

I just noticed that when I try to send http request while there are already http requests going on in the background, one of them stops and waits until the previous one will finish.我刚刚注意到,当我尝试发送 http 请求而后台已经有 http 请求时,其中一个会停止并等待前一个请求完成。 They both use their own QNetworkAccessManagers.他们都使用自己的 QNetworkAccessManagers。 Can anyone explain why this is happening?谁能解释为什么会这样?

UPDATE i must doing here something wrong and i don't know, here some code.更新我必须在这里做错事,我不知道,这里有一些代码。
there are 2 http post functions the first is simple post that invoked every 5 sec and the second one is file upload post function that call in parallel.有 2 个 http 发布功能第一个是简单的发布,每 5 秒调用一次,第二个是文件上传发布 function 并行调用。
when i call the file upload the first stops, whits until the file upload finished and continue this is come's from Qt with out my intervention.当我调用文件上传第一站时,直到文件上传完成并继续这是来自 Qt 没有我的干预。 this is with single QNetworkAccessManager这是单个 QNetworkAccessManager

    //Init in the class contractor

     networkManager = new QNetworkAccessManager(this); 
     connect(networkManager,SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), this, SLOT(on_sslErr(QNetworkReply*,QList<QSslError>)));


    //-----------------------------------------------------\\

    //this is upload file code , its taking time untill it finish working great

    PostImageRequest( QString& Response,
                                    QMap<QString,QString> paramsToPostMap,
                                    QString& BaseUrl,
                                    QString imageFullPath,
                                    int iTimeOutInterval)


    QByteArray imageFormat = QImageReader::imageFormat(imageFullPath);
    QString imageMimeType(imageFormat);
    QNetworkRequest request;
    QUrl params;
    QMapIterator<QString,QString> i(paramsToPostMap);
    while (i.hasNext()) {
        i.next();
        addField(i.key(),i.value());
    }

      addFile("file",imageFullPath,imageMimeType);
      QString crlf="\r\n";
      qsrand(QDateTime::currentDateTime().toTime_t());
      QString b=QVariant(qrand()).toString()+QVariant(qrand()).toString()+QVariant(qrand()).toString();
      QString boundary="---------------------------"+b;
      QString endBoundary=crlf+"--"+boundary+"--"+crlf;
      QString contentType="multipart/form-data; boundary="+boundary;
      boundary="--"+boundary+crlf;
      QByteArray bond=boundary.toAscii();
      QByteArray send;
      bool first=true;

      for (int i=0; i<fieldNames.size(); i++) {
        send.append(bond);
        if (first) {
          boundary=crlf+boundary;
          bond=boundary.toAscii();
          first=false;
        }
        send.append(QString("Content-Disposition: form-data; name=\""+fieldNames.at(i)+"\""+crlf).toAscii());
        if (encodingS=="utf-8") send.append(QString("Content-Transfer-Encoding: 8bit"+crlf).toAscii());
        send.append(crlf.toAscii());
        send.append(strToEnc(fieldValues.at(i)));
      }
      for (int i=0; i<files.size(); i++) {
        send.append(bond);
        send.append(QString("Content-Disposition: form-data; name=\""+fileFieldNames.at(i)+"\"; filename=\""+fileNames.at(i)+"\""+crlf).toAscii());
        send.append(QString("Content-Type: "+fileMimes.at(i)+crlf+crlf).toAscii());
        send.append(files.at(i));  
      }

      send.append(endBoundary.toAscii());

      fieldNames.clear();
      fieldValues.clear();
      fileFieldNames.clear();
      fileNames.clear();
      fileMimes.clear();
      files.clear();
     request.setHeader(QNetworkRequest::ContentTypeHeader, contentType.toAscii());
 request.setHeader(QNetworkRequest::ContentLengthHeader, QVariant(send.size()).toString());
     request.setUrl(BaseUrl);


     if(iTimeOutInterval != -1)
     {
         QEventLoop loop2;
         QTimer::singleShot(iTimeOutInterval, &loop2, SLOT(quit()) );
         loop2.exec();
 }
     QEventLoop loop;
     QNetworkReply *reply = networkManager->post(request,send);
     connect(reply, SIGNAL(uploadProgress(qint64,qint64)), this,SLOT(SetProgress(qint64,qint64)));
     connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
 loop.exec();       
     //return response 
     QNetworkReply::NetworkError networkError = reply->error();
     HandleNetworkError(networkError); 
     Response.clear();
     QByteArray data=reply->readAll();
     Response.append(data);
     //delete reply;
     reply->deleteLater();

    //--------------------------------------------------------------------------------\\

//this is the post function that invoket every 5 secound

    PostRequest(QString& Response,
                            QMap<QString,QString> paramsToPostMap,
                            QString& BaseUrl,
                            int iTimeOutInterval)


     QNetworkRequest request;
     QUrl params;
     QMapIterator<QString,QString> i(paramsToPostMap);
     while (i.hasNext()) {
        i.next();
        params.addQueryItem(i.key(),i.value());
     }
     request.setUrl(BaseUrl);

     QByteArray postArgs;
     postArgs = params.encodedQuery();

     if(iTimeOutInterval != -1)
     {
         QEventLoop loop2;
         QTimer::singleShot(iTimeOutInterval, &loop2, SLOT(quit()) );
         loop2.exec();
 }
     QEventLoop loop;
     QNetworkReply *reply = networkManager->post(request,postArgs);
     connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
 loop.exec();       
     //return response 
     QNetworkReply::NetworkError networkError = reply->error();
     HandleNetworkError(networkError); 
     Response.clear();
     QByteArray data=reply->readAll();
     Response.append(data);


     //delete reply;
     reply->deleteLater(); 

From the Qt 4.7 reference :来自Qt 4.7 参考

QNetworkAccessManager queues the requests it receives. QNetworkAccessManager 将它收到的请求排队。 The number of requests executed in parallel is dependent on the protocol.并行执行的请求数取决于协议。 Currently, for the HTTP protocol on desktop platforms, 6 requests are executed in parallel for one host/port combination.目前,对于桌面平台上的HTTP协议,一个主机/端口组合并行执行6个请求。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 QT 中使用 QNetworkAccessManager 的 HTTP POST 请求 - HTTP POST request in QT using QNetworkAccessManager Qt QNetworkAccessManager post 方法仅在主线程中有效 - Qt QNetworkAccessManager post method works only in main thread Qt无法使用QNetworkAccessManager下载文件 - Qt Can't download file using QNetworkAccessManager 在QT QNetworkAccessManager中的HTTP获取请求中获取空响应 - Getting empty response in HTTP get request in QT QNetworkAccessManager 如何使用 QNetworkAccessManager 作为 QT DLL function 下载文件? - How can i download a file using QNetworkAccessManager as a QT DLL function? 使用 QNetworkAccessManager 发送 HTTP 请求 - Sending an HTTP request using QNetworkAccessManager 如何使用QNetworkAccessManager和QNetworkReply正确执行http GET请求? URL如何影响Qt中的请求? - How to properly do a http GET request using QNetworkAccessManager and QNetworkReply? How does the URL affect the request in Qt? http请求中的QNetworkReply和QNetworkAccessManager超时 - QNetworkReply and QNetworkAccessManager timeout in http request 我可以知道QNetworkAccessManager是否完成了对所有HTTP请求的处理吗? - can i know if QNetworkAccessManager done processing all http requests? 在我的工作线程为“主”线程的Qt应用中,如何与GUI线程通信 - In a Qt app, where my worker thread is the “main” thread, how can I communicate with the GUI thread
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM