在做更新,在测试异常的时候,在下载过程中,发现如果直接系统禁用了网络,会报错误,可以捕获。但是如果是第三方软件限制程序联网,问题来了。

程序会一直在那里等待,没有异常,也不发送QNetworkAccessManager::finsh和QNetworkReply::error和QNetworkReply::finsh信号。

所以动念头为下载加个超时,但是QNetworkAccessManager,QNetworkReply和QNetworkRequest都没有相关的设置函数。其实仔细想一下,也没有办法直接提供超时,因为下载的文件有大有小,网络有快有慢,什么才算超时呢。只有自己想办法添加了。因为这个异常必须想办法发现并处理它,那么问题就必须要解决了。

先说下我的解决思路,利用QNetworkReply::downloadProgress 信号来实现,自己记录一段时间里的下载字节数,用定时器去定期检测,如果一段时间了,一点多余的下载都没有,那么我就认为网络超时异常了。

下面就上代码,自己简单用代码描述下:

声明:

01 class NetWorkDownload : public QObject
02 {
03     Q_OBJECT
04 public:
05     explicit NetWorkDownload(QObject *parent = 0);
06 signals:
07     void timeOut();
08     //····你的其他需要传递出去的信号
09 public slots:
10     void startDownload(const QString & url);
11      
12 protected slots:
13     void handleReply(QNetworkReply * rep);//处理下载完成的数据
14     void handSize(qint64 size, qint64 all);
15     void handleTimeOut();
16 private:
17     QNetworkAccessManager manger;
18     int fileDownSize,//已经下载的字节数
19         lastDownSize;//定时器上次下载的字节数
20     QTimer tm;//定时器
21 };

实现:

01 NetWorkDownload::NetWorkDownload(QObject *parent) :
02     QObject(parent)
03 {
04     //这个connect你也可以用QNetworkReply来链接,QNetworkReply::finsh,QNetworkReply::readyReady这些信号。
05     connect(&manger,&QNetworkAccessManager::finished,this,&NetWorkDownload::handleReply);
06     connect(&tm,&QTimer::timeout,this,&NetWorkDownload::timeOut);
07 }
08  
09 void NetWorkDownload::startDownload(const QString & url)
10 {
11     QNetworkRequest req;
12     req.setUrl(QUrl(url));
13     auto rep = manger.get(req);
14     connect(rep,&QNetworkReply::downloadProgress,this,&NetWorkDownload::handSize);
15     //启动超时定时,30s。
16     if (tm.isActive())
17         tm.stop();
18     tm.start(30000);
19 }
20  
21 void NetWorkDownload::handSize(qint64 size,qint64 /* all*/)
22 {
23     fileDownSize = size;
24 }
25  
26 void NetWorkDownload::handleReply(QNetworkReply *rep)
27 {
28     /*
29     下载完成的您的处理代码。
30     */
31     fileDownSize = 0;
32     lastDownSize = 0;
33     if (tm.isActive())//如果还在定时,就停止
34         tm.stop();
35 }
36  
37 void NetWorkDownload::timeOut()
38 {
39     if (lastDownSize != fileDownSize)//如果过了30s,一点字节也没有下载过来,认为超时了。
40         lastDownSize = fileDownSize;
41     else
42         emit timeOut();
43 }

http://www.dushibaiyu.com/2014/10/qnetworkaccessmanager-timeout.html

http://stackoverflow.com/questions/13207493/qnetworkreply-and-qnetworkaccessmanager-timeout-in-http-request

为QNetworkAccessManager添加超时提醒(自己记录一段时间里的下载字节数,用定时器去定期检测,从而判断是否超时)的更多相关文章

  1. 记录这段时间java编程的小知识点

    记录这段时间java编程的小知识点 eclipse项目导入中文乱码 eclipse左侧目录结构变动 eclipse代码段左右移动 按tal键,是整体右移. 按shift  table 同时按,是整体左 ...

  2. WCF 添加服务引用 HTTP 请求已超过为 00:00:00 分配的超时。为此操作分配的时间可能是较长超时

    今天在用公司的笔记本引用WCF的时候,处于一直等待的过程,一直在下载信息,一直等了很长时间,弹出了一个消息 下载“http://ip:8085/xxxxx/xxxxx/mex/$metadata”时出 ...

  3. MVC批量添加,增加一条记录的同时添加N条集合属性所对应的个体

    类别中包含一个产品的集合属性,如何向数据库添加一条类别记录的同时,添加任意多个产品. public class Product { [DisplayName("产品名称")] pu ...

  4. Android向系统日历添加日程提醒事件

    在项目开发过程中,有时会有预约提醒.定时提醒等需求,这时我们可以使用系统日历来辅助提醒.通过向系统日历中写入事件.设置提醒方式(闹钟),实现到达某个特定的时间自动提醒的功能.这样做的好处是由于提醒功能 ...

  5. 真实世界:使用WCF扩展记录服务调用时间

    WCF 可扩展性 WCF 提供了许多扩展点供开发人员自定义运行时行为. WCF 在 Channel Layer 之上还提供了一个高级运行时,主要是针对应用程序开发人员.在 WCF 文档中,它常被称为服 ...

  6. 使用WCF扩展记录服务调用时间

    随笔- 64  文章- 0  评论- 549  真实世界:使用WCF扩展记录服务调用时间   WCF 可扩展性 WCF 提供了许多扩展点供开发人员自定义运行时行为. WCF 在 Channel Lay ...

  7. Python_socket常见的方法、网络编程的安全注意事项、socketsever模块、浏览器中在一段时间记录用户的登录验证机制

    1.socket常见的方法 socket_常见方法_服务器端 import socket from socket import SOL_SOCKET,SO_REUSEADDR sk = socket. ...

  8. 如何在Sql Server中读取最近一段时间的记录,比如取最近3天的或最近3个月的记录。

    如何在Sql Server中读取最近一段时间的记录,比如取最近3天的或最近3个月的记录. 主要用到DATEADD函数,下面是详细语句 取最近3天 select * from 表名where rq> ...

  9. WCF扩展记录服务调用时间

    WCF 提供了许多扩展点供开发人员自定义运行时行为. WCF 在 Channel Layer 之上还提供了一个高级运行时,主要是针对应用程序开发人员.在 WCF 文档中,它常被称为服务模型层(Serv ...

随机推荐

  1. 通过一次SpringBoot打成war包部署到tomcat启动总结一般jar包冲突的解决方法

    启动时,报错信息如下: 28-Sep-2018 16:55:41.567 严重 [localhost-startStop-1] org.apache.catalina.core.StandardCon ...

  2. spring boot 生成 war 包有一个war.original是什么?

    两个坑 .war.original 生成这种格式的文件,是因为在开启了二次打包.具体可以看这里 修改入口文件的配置 , 官方文档看这里 类似下面的代码,要继承SpringBootServletInit ...

  3. maven webcollector java.lang.ClassNotFoundException: org.openqa.selenium.remote.SessionNotFoundException

    使用webcollector时出现了如下异常 分析是依赖的问题,不仅要添加selenium-java,还要添加htmlunit-driver的依赖,注意不要添加成selenium-htmlunit-d ...

  4. ANDROID L——RecyclerView,CardView进口和使用(Demo)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 简单介绍: 这篇文章是ANDROID L--Material Design具体解释(UI控 ...

  5. docker入门2:基础操作(1)

    -- 列出所有的容器 docker ps -a  (没有-a就是只列出启动的) -- 开启/关闭/移除容器 docker start|stop|rm CONTAINER_ID|CONTAINER_NA ...

  6. Android——Intent详解

    Intent组件虽然不是四大组件,但却是连接四大组件的桥梁,学习好这个知识,也非常的重要. 一.什么是Intent 1.Intent的概念: Android中提供了Intent机制来协助应用间的交互与 ...

  7. 微信公众平台消息接口开发(12)消息接口Bug

    微信公众平台开发模式 微信公众平台消息接口 微信公众平台API 微信开发模式 Bug 方倍工作室 原文:http://www.cnblogs.com/txw1958/archive/2013/03/1 ...

  8. Linux下快速静态编译Qt以及Qt动态/静态版本共存(提供了编译4.6,5.6的精通编译脚本,并且apt-get install 需要的库也全列出来了。还有分析问题的心理过程)good

    qt4.6 Linux./configure -static -release -confirm-license -opensource -qt-zlib -qt-libpng -qt-libjpeg ...

  9. SQL Server 2017 正式发布:同时支持 Windows 和 Linux(现在看下来,当年那德拉的“云优先,移动优先”是有远见的,而且是有一系列的措施和产品相配合的,只是需要一点时间而已。真是佩服!!)

    微软在去年 3 月首次对外宣布了 Linux 版的 SQL Server,并于今年 7 月发布了首个公开 RC 版.前几日在美国奥兰多召开的微软 Ignite 2017 大会上,微软宣布 SQL Se ...

  10. uva 1436 - Counting heaps(算)

    题目链接:uva 1436 - Counting heaps 题目大意:给出一个树的形状,如今为这棵树标号,保证根节点的标号值比子节点的标号值大,问有多少种标号树. 解题思路:和村名排队的思路是一仅仅 ...