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

程序会一直在那里等待,没有异常,也不发送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. 微信,支付宝,支付异步通知验签,notify_url

    在支付接口开发中 ,当用户支付完成之后,阿里或者微信会向我们服务器发送一个支付结果的通知,里边带有一系列参数:其中特殊的是签名类型,和签名(他们根据这些参数做出来的签名). 我们的得到这些参数之后要去 ...

  2. jsp中国文字形式提交,request对象获取乱码

    jsp表单提交中文字符,request对象获取时乱码解决方法 第一种: 在request对象获取页面Charset中的"C"大写,且页面无中文字符,最好用英文,否则MyEclips ...

  3. Tcl package require Tk 出现没用的小方框

    package require Tk wm withdraw .  当引用了tk的时候会出现一个tk的方框 , 下面那句话就是隐藏掉那个方框

  4. svg查看预览 , 鼠标控制放大缩小 , 托拉拽等

    自己写是不可能了 , 所以要借用插件 svg-panzoom.js 地址 : https://github.com/ariutta/svg-pan-zoom#demos 及常见问题https://ww ...

  5. 广义逆高斯分布(Generalized Inverse Gaussian Distribution)及修正贝塞尔函数

    1. PDF generalized inverse Gaussian distribution (GIG) 是一个三参数的连续型概率分布: f(x)=(a/b)p/22Kp(ab−−√)xp−1e− ...

  6. Javascript中的类实现

    Javascript本身并不支持面向对象,它没有访问控制符,它没有定义类的关键字class,它没有支持继承的extend或冒号,它也没有用来支持虚函数的virtual,不过,Javascript是一门 ...

  7. windows通过使用xShell远程linux上传文件

    上传文件rz与sz命令,远程linux您需要在系统上安装lrzsz工具包 安装例如,下面的: [xxxx@xxxx /]# yum install lrzsz 注意:我用命令yum,假设在Intern ...

  8. code first迁移(add-migration)的时候 后面信息不能有中文 中文报错 "不支持给定路径的格式。"

  9. Linux性能测试 /proc目录

    /proc文件系统 - 各种内核信息/proc目录下文件提供了很多不同硬件设备和内核的详细信息.更多详情参见Linux kernel /proc.一般/proc例如: [root@SM155 proc ...

  10. 用游戏杆控制WPF中三维模型

    原文:用游戏杆控制WPF中三维模型 用游戏杆控制WPF中三维模型   今天心情比较好,不写WF的文章了,换个主题.写一个我最最最擅长的内容.   例子下载: http://files.cnblogs. ...