Qt QNetworkAccessManager, почему я не могу отправить более 1 HTTP-запроса параллельно в одном и том же главном потоке - PullRequest
0 голосов
/ 12 августа 2011

Я только что заметил, что когда я пытаюсь отправить http-запрос, в то время как в фоновом режиме уже выполняются http-запросы, один из них останавливается и ждет, пока предыдущий не завершится.Они оба используют свои собственные QNetworkAccessManager.Может кто-нибудь объяснить, почему это происходит?

ОБНОВЛЕНИЕ Я должен сделать что-то здесь не так, и я не знаю, вот какой-то код.
Есть 2 функции http поста, во-первых,простая запись, которая вызывается каждые 5 секунд, а вторая - это функция публикации файла, которая вызывает параллельно.
когда я вызываю файл, загрузка останавливается с первой остановки, до тех пор, пока загрузка файла не закончится и продолжится, это пришло из Qt без моеговмешательство.это с одним 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(); 

1 Ответ

3 голосов
/ 12 августа 2011

Из ссылки Qt 4.7 :

QNetworkAccessManager ставит в очередь полученные запросы.Количество запросов, выполняемых параллельно, зависит от протокола.В настоящее время для протокола HTTP на настольных платформах 6 запросов выполняются параллельно для одной комбинации хост / порт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...