[英]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.