2011-08-12 8 views
0

나는 http 요청을 보내려고 할 때 이미 http 요청이있는 동안 이 백그라운드에서 계속 발생하는 것으로 나타났습니다. 이전의 것이 끝날 때까지 멈추고 기다린다. 둘 다 자체 QNetworkAccessManagers를 사용합니다. 왜 이런 일이 일어 났는지 설명 할 수 있습니까?Qt QNetworkAccessManager 동일한 기본 스레드에서 병렬로 1 이상의 HTTP 요청을 보낼 수없는 이유는 무엇입니까?

UPDATE 여기에 몇 가지 코드를 내가 여기서 뭔가 잘못하고 있어야하며 모르겠어.
두 개의 HTTP 게시물 기능이 있습니다. 첫 번째 메시지는 5 초마다 호출되는 간단한 게시물이고 두 번째 파일은 병렬로 호출하는 파일 업로드 게시 기능입니다.
파일 업로드를 호출하면 파일 업로드가 끝날 때까지 오순절 소리가 들리고 계속 진행됩니다.이 작업은 내 중재가 끝난 상태에서 Qt에서 시작됩니다. 이는 Qt 4.7 reference에서 단일 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(); 
+0

몇 가지 코드를 볼 수 있습니까? –

+0

그리고 QNetworkAccessManager의 다중 인스턴스를 사용하지 마십시오. 그것은 공유되고 여러 인스턴스가 비싸도록 설계되었습니다. –

+1

Qt 4.7 참조에서 : QNetworkAccessManager는받은 요청을 대기열에 넣습니다. 병렬로 실행되는 요청 수는 프로토콜에 따라 다릅니다. 현재 데스크톱 플랫폼의 HTTP 프로토콜의 경우 하나의 호스트/포트 조합에 대해 6 개의 요청이 병렬로 실행됩니다. – Purnima

답변

2

함께 :

QNetworkAccessManager는 수신 요청을 큐에. 병렬로 실행되는 요청 수는 프로토콜에 따라 다릅니다. 현재 데스크톱 플랫폼의 HTTP 프로토콜의 경우 하나의 호스트/포트 조합에 대해 6 개의 요청이 병렬로 실행됩니다.

+0

나는 이것을 안다. 그러나 나는 6 이하가있다. – user63898

관련 문제