C++ Qt QNetworkAccessManager为什么我可以’;t在同一主线程中并行发送超过1个http请求
我只是注意到,当我尝试发送http请求时,已经有http请求了 在后台进行时,其中一个停止并等待,直到前一个结束。他们都使用自己的QNetworkAccessManager。有人能解释为什么会这样吗 更新 我必须在这里做些错事,我不知道,这里有一些代码。C++ Qt QNetworkAccessManager为什么我可以’;t在同一主线程中并行发送超过1个http请求,c++,qt,C++,Qt,我只是注意到,当我尝试发送http请求时,已经有http请求了 在后台进行时,其中一个停止并等待,直到前一个结束。他们都使用自己的QNetworkAccessManager。有人能解释为什么会这样吗 更新 我必须在这里做些错事,我不知道,这里有一些代码。 有两个http post函数第一个是每5秒调用一次的简单post 第二个是并行调用的文件上传post函数。 当我调用文件上传时,首先停止,直到文件上传完成并继续,这是来自Qt的,没有我的干预。 这是一个QNetworkAccessManager
有两个http post函数第一个是每5秒调用一次的简单post 第二个是并行调用的文件上传post函数。
当我调用文件上传时,首先停止,直到文件上传完成并继续,这是来自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();
//承包商类中的Init
networkManager=新的QNetworkAccessManager(此);
连接(网络管理器,信号(sslErrors(QNetworkReply*,QList)),此,插槽(在sslErr(QNetworkReply*,QList))上);
//-----------------------------------------------------\\
//这是上传文件的代码,它需要时间,直到它完成伟大的工作
后映像请求(Q字符串和响应,
QMap paramstopstmap,
QString和BaseUrl,
QString imageFullPath,
int ITIMEOUTERVAL)
QByteArray imageFormat=QImageReader::imageFormat(imageFullPath);
QString imageMimeType(imageFormat);
QNetworkRequest请求;
QUrl参数;
QMapIterator i(paramsToPostMap);
while(i.hasNext()){
i、 next();
addField(i.key(),i.value());
}
addFile(“文件”、imageFullPath、imageMimeType);
QString crlf=“\r\n”;
qsrand(QDateTime::currentDateTime().toTime_t());
QString b=QVariant(qrand()).toString()+QVariant(qrand()).toString()+QVariant(qrand()).toString();
QString边界=“------------------------------------”+b;
QString endBoundary=crlf+“--”+boundary+“--”+crlf;
QString contentType=“多部分/表单数据;boundary=“+boundary;
边界=“--”+边界+crlf;
QByteArray-bond=boundary.toAscii();
QByteArray发送;
bool first=true;
对于(int i=0;ierror();
HandleNetworkError(networkError);
Response.clear();
QByteArray data=reply->readAll();
响应。追加(数据);
//删除答复;
回复->删除稍后();
//--------------------------------------------------------------------------------\\
//这是每5秒调用一次的post函数
PostRequest(Q字符串和响应,
QMap paramstopstmap,
QString和BaseUrl,
int ITIMEOUTERVAL)
QNetworkRequest请求;
QUrl参数;
QMapIterator i(paramsToPostMap);
while(i.hasNext()){
i、 next();
参数addQueryItem(i.key(),i.value());
}
setUrl(BaseUrl);
QByteArray postArgs;
postArgs=params.encodedQuery();
如果(ITimeoutterval!=-1)
{
QEventLoop循环2;
QTimer::singleShot(iTimeOutInterval,&loop2,SLOT(quit());
loop2.exec();
}
QEventLoop循环;
QNetworkReply*reply=networkManager->post(请求,postArgs);
连接(应答、信号(finished())、循环和插槽(quit());
loop.exec();
//返回响应
QNetworkReply::NetworkError NetworkError=reply->error();
HandleNetworkError(networkError);
Response.clear();
QByteArray data=reply->readAll();
响应。追加(数据);
//删除答复;
回复->删除稍后();
来自:
QNetworkAccessManager将接收到的请求排队。并行执行的请求数取决于协议。目前,对于桌面平台上的HTTP协议,一个主机/端口组合并行执行6个请求。来自:
QNetworkAccessManager对接收到的请求进行排队。并行执行的请求数取决于协议。目前,对于桌面平台上的HTTP协议,一个主机/端口组合并行执行6个请求。并且不使用QNetworkAccessManager的多个实例。它旨在共享和共享保存多个实例的代价很高。根据Qt 4.7参考:QNetworkAccessManager将接收的请求排队。并行执行的请求数取决于协议。目前,对于桌面平台上的HTTP协议,一个主机/端口组合并行执行6个请求。@Purnima:您可以将链接发布到文档并将其作为答案发布,我认为它回答了问题。哦,如果你这样做,你会得到我的支持。:)我在这里公然做了一些错误,我提出了我的http请求代码,它在一个单例类中。我想你需要创建一个最低版本的代码来重现你的问题,代码现在似乎太复杂了。不要使用QNetworkAccessManager的多个实例。它是为共享而设计的,拥有多个实例的成本很高。从Qt 4.7参考:QNetworkAccessManager将接收到的请求排队。并行执行的请求数取决于协议。目前,对于桌面平台上的HTTP协议,一个主机/端口组合并行执行6个请求。@Purnima:您可以将链接发布到文档并将其作为答案发布,我认为它回答了这个问题。哦,如果你这样做,我会投你一票我敢说我在这里做错了什么我提出了我的http请求代码它在一个单例类中我认为你需要创建一个最低版本的代码来重现你的问题,代码现在似乎太复杂了。我知道这一点,但我只有不到6我知道这一点,但我只有不到6