为QNetworkAccessManager添加超时提醒(自己记录一段时间里的下载字节数,用定时器去定期检测,从而判断是否超时)
2024-08-20 22:07:16 220人阅读
在做更新,在测试异常的时候,在下载过程中,发现如果直接系统禁用了网络,会报错误,可以捕获。但是如果是第三方软件限制程序联网,问题来了。
程序会一直在那里等待,没有异常,也不发送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; |
实现:
01 | NetWorkDownload::NetWorkDownload(QObject *parent) : |
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 ) |
26 | void NetWorkDownload::handleReply(QNetworkReply *rep) |
37 | void NetWorkDownload::timeOut() |
39 | if (lastDownSize != fileDownSize) |
40 | lastDownSize = fileDownSize; |
http://www.dushibaiyu.com/2014/10/qnetworkaccessmanager-timeout.html
http://stackoverflow.com/questions/13207493/qnetworkreply-and-qnetworkaccessmanager-timeout-in-http-request
为QNetworkAccessManager添加超时提醒(自己记录一段时间里的下载字节数,用定时器去定期检测,从而判断是否超时)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉:
投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。