나는 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();
몇 가지 코드를 볼 수 있습니까? –
그리고 QNetworkAccessManager의 다중 인스턴스를 사용하지 마십시오. 그것은 공유되고 여러 인스턴스가 비싸도록 설계되었습니다. –
Qt 4.7 참조에서 : QNetworkAccessManager는받은 요청을 대기열에 넣습니다. 병렬로 실행되는 요청 수는 프로토콜에 따라 다릅니다. 현재 데스크톱 플랫폼의 HTTP 프로토콜의 경우 하나의 호스트/포트 조합에 대해 6 개의 요청이 병렬로 실행됩니다. – Purnima