在做更新,在测试异常的时候,在下载过程中,发现如果直接系统禁用了网络,会报错误,可以捕获。但是如果是第三方软件限制程序联网,问题来了。
程序会一直在那里等待,没有异常,也不发送QNetworkAccessManager::finsh和QNetworkReply::error和QNetworkReply::finsh信号。
所以动念头为下载加个超时,但是QNetworkAccessManager,QNetworkReply和QNetworkRequest都没有相关的设置函数。其实仔细想一下,也没有办法直接提供超时,因为下载的文件有大有小,网络有快有慢,什么才算超时呢。只有自己想办法添加了。因为这个异常必须想办法发现并处理它,那么问题就必须要解决了。
先说下我的解决思路,利用QNetworkReply::downloadProgress 信号来实现,自己记录一段时间里的下载字节数,用定时器去定期检测,如果一段时间了,一点多余的下载都没有,那么我就认为网络超时异常了。
下面就上代码,自己简单用代码描述下:
声明:
01 |
class NetWorkDownload : public QObject
|
05 |
explicit NetWorkDownload(QObject *parent = 0);
|
10 |
void startDownload( const QString & url);
|
13 |
void handleReply(QNetworkReply * rep); //处理下载完成的数据
|
14 |
void handSize(qint64 size, qint64 all);
|
17 |
QNetworkAccessManager manger;
|
18 |
int fileDownSize, //已经下载的字节数
|
19 |
lastDownSize; //定时器上次下载的字节数
|
实现:
01 |
NetWorkDownload::NetWorkDownload(QObject *parent) : |
04 |
//这个connect你也可以用QNetworkReply来链接,QNetworkReply::finsh,QNetworkReply::readyReady这些信号。
|
05 |
connect(&manger,&QNetworkAccessManager::finished, this ,&NetWorkDownload::handleReply);
|
06 |
connect(& tm ,&QTimer::timeout, this ,&NetWorkDownload::timeOut);
|
09 |
void NetWorkDownload::startDownload( const QString & url)
|
12 |
req.setUrl(QUrl(url));
|
13 |
auto rep = manger.get(req);
|
14 |
connect(rep,&QNetworkReply::downloadProgress, this ,&NetWorkDownload::handSize);
|
21 |
void NetWorkDownload::handSize(qint64 size,qint64 /* all*/ )
|
26 |
void NetWorkDownload::handleReply(QNetworkReply *rep)
|
33 |
if ( tm .isActive()) //如果还在定时,就停止
|
37 |
void NetWorkDownload::timeOut()
|
39 |
if (lastDownSize != fileDownSize) //如果过了30s,一点字节也没有下载过来,认为超时了。
|
40 |
lastDownSize = fileDownSize;
|
http://www.dushibaiyu.com/2014/10/qnetworkaccessmanager-timeout.html
http://*.com/questions/13207493/qnetworkreply-and-qnetworkaccessmanager-timeout-in-http-request