【发布时间】:2014-01-08 03:13:57
【问题描述】:
我正在尝试使用 QNetworkAccessManager 进行多个请求,即使我连接插槽 QNetworkAccessManager 也无法发出 finished() 信号。
这是我实现的代码。
void GetNetwork::getAction(QStringList *urls, QList<QByteArray> *result)
{
uint size=urls->size();
multiGetResult=result;
getUrls=urls;
setFlags();
for(uint x=0;x<size;x++)
{
int test=caluculateIndex(x);
getNAM[test]->get(QNetworkRequest(QUrl(urls->at(x))));
}
//qDebug()<<reply->readAll();
while (!waitWithFlag()) QThread::msleep(15);
delete threadFlag;
}
bool GetNetwork::setMultipleGet(uint number)
{
int diff=number-(getNAM.size()-1);
if(((getNAM.size()-1)+diff)<0)
return false;
for(int i=0;i<diff;i++)
{
getNAM.append(new QNetworkAccessManager(this));
connect(getNAM[getNAM.size()-1],SIGNAL(finished(QNetworkReply*)),this,SLOT(handleMultiRequest(QNetworkReply*)));
}
for(int i=diff;i<0;i++)
{
disconnect(getNAM[getNAM.size()-1],SIGNAL(finished(QNetworkReply*)),this,SLOT(handleMultiRequest(QNetworkReply*)));
delete getNAM[getNAM.size()-1];
getNAM.remove(getNAM.size()-1);
}
return true;
}
void GetNetwork::handleMultiRequest(QNetworkReply * reply)
{
int index=getUrls->indexOf(reply->url().toString());
if(reply->error()!=QNetworkReply::NoError||index==-1)
{
QString error=QString("Network Error file:%1 line:%2 error:%3")
.arg(__FILE__)
.arg(__LINE__)
.arg(reply->errorString());
emit errorOccured(error);
return;
}
multiGetResult->insert(index,reply->readAll());
threadFlag[index]=true;
}
这些代码有什么问题?我想不通。
谢谢。
【问题讨论】:
-
你有没有尝试hook错误信号?
-
您必须返回事件循环才能执行请求并报告结果。带有 while 循环和 sleep 的代码看起来像是阻塞了事件循环(直到结果到达?),因此根本不执行请求。
-
即,sleep() 会阻塞事件循环,因此会阻塞任何事件处理,包括网络 I/O。同样在 UI 应用程序中,主线程中的 sleep() 是非常糟糕的做法,因为它会使 UI 无响应。
-
不,它会等到所有线程都完成。但是 qnetworkaccessmanager 没有发出完成的信号,并且函数在这里等待什么。我只是想确保所有获取都在函数结束时完成。
-
问题是关于 while "(!waitWithFlag()) QThread::msleep(10);"函数的结尾有没有办法等到所有这些都完成?