Qt|使用 Http 通讯下载页面实时显示
上一章节中介绍了如何使用 HTTP 通讯下载 url 文件信息。
如果网络理想情况下,会很快下载成功,或者是文件比较小,也会很快下载成功的。
但是,当网络不通畅的时候?下载文件过大时候?会造成页面卡顿,给使用者呈现出一种程序未响应状态。
针对上述极有可能出现的问题,今天来讲解下如何在页面中实时查看下载进度。
下载实时显示
在下载 url 时,我们可以提前获取到文件的总长度,以及每次实时下载的长度。根据这两点,就可以实现在页面上实时显示的效果了。
一般在界面上会采用进度条控件实时显示下载进度
1:发送文件总长度
当接收到 http 返回的文件总长度时,及时通知到页面。
也就是在"WinHttpQueryHeaders"函数后面,发送槽函数,通知窗口,假设,我们定义为:
Msg_SendFilesTotalLens(int dwTotalSize);
2:发送实时下载长度
在"WinHttpQueryDataAvailable"的 while 循环中,会每次获取 4096 个长度,那么我们需要发送实时获取的长度。
在这里,需要注意的是,发送的数据一定是追加之后的数据,而不是每次下载的数据。
发送的槽函数是:Msg_SendFilesCurrentLens(int dwCurrentSize);
3:界面接收文件总长度信息
下载 http 的类定义了发送消息之后,我们就需要在显示页面上接收并显示接收的内容
槽函数连接
响应函数实现
4:界面接收实时下载文件长度
当前功能比较简单,只是实时更新进度条的进度值就可以了
防止页面假死
上述功能完成的是如何在页面上显示。
一般情况下,我们在做下载操作时,会放到线程里进行实现的。为了实现可以在下载的同时又操作其他显示页面。做到了互不干扰。
针对这样的功能,我们需要采用 QT 中一个比较方便的开线程方式:QtConcurrent::run
具体的详细使用规则不再过多说明了,之前就有更新过,如果有不了解的,可以去查看哦~
使用 HTTP 通讯下载的同时实时进行页面展示的功能就更新到这里啦~
我是中国好公民 st,一名 C++开发程序媛~
版权声明: 本文为 InfoQ 作者【中国好公民st】的原创文章。
原文链接:【http://xie.infoq.cn/article/f416d2d4f01f46bf8a9e0dc96】。文章转载请联系作者。
评论