上一章节中介绍了如何使用HTTP通讯下载url文件信息。
如果网络理想情况下,会很快下载成功,或者是文件比较小,也会很快下载成功的。
但是,当网络不通畅的时候?下载文件过大时候?会造成页面卡顿,给使用者呈现出一种程序未响应状态。
针对上述极有可能出现的问题,今天来讲解下如何在页面中实时查看下载进度。
下载实时显示
在下载url时,我们可以提前获取到文件的总长度,以及每次实时下载的长度。根据这两点,就可以实现在页面上实时显示的效果了。
一般在界面上会采用进度条控件实时显示下载进度
1:发送文件总长度
当接收到http返回的文件总长度时,及时通知到页面。
也就是在"WinHttpQueryHeaders"函数后面,发送槽函数,通知窗口,假设,我们定义为:
Msg_SendFilesTotalLens(int dwTotalSize);
2:发送实时下载长度
在"WinHttpQueryDataAvailable"的while循环中,会每次获取4096个长度,那么我们需要发送实时获取的长度。
在这里,需要注意的是,发送的数据一定是追加之后的数据,而不是每次下载的数据。
DWORD dwSize, dwWrite, dwCalcSize = 0;
while (WinHttpQueryDataAvailable(hRequest, &dwSize) && dwSize)
{
if (dwSize > 4096)
{
dwSize = 4096;
}
//发送实时文件长度
dwCalcSize += dwSize;
emit Msg_SendFilesCurrentLens(dwCalcSize);
ZeroMemory(pBuffer, 4096);
WinHttpReadData(hRequest, pBuffer, dwSize, &dwSize);
WriteFile(hFile, pBuffer, dwSize, &dwWrite, NULL);
}
发送的槽函数是:Msg_SendFilesCurrentLens(int dwCurrentSize);
3:界面接收文件总长度信息
下载http的类定义了发送消息之后,我们就需要在显示页面上接收并显示接收的内容
槽函数连接
connect(m_pHttp, &QDownLoad::Msg_SendFilesTotalLens, this,&QMywidget::MsgReceivedTotalLens);
响应函数实现
QMyWidget::MegReceivedTotalLens(int dwTotalSize)
{
//第一步:将进度条重新回到开始
ui.progressBar->reset();
//第二步:设置范围值
ui.progressBar->setMinimum(0);
ui.progressBar->setMaximum(dwTotalSize);
}
4:界面接收实时下载文件长度
当前功能比较简单,只是实时更新进度条的进度值就可以了
ui.progressBar->setValue(dwCurrentLens);
防止页面假死
上述功能完成的是如何在页面上显示。
一般情况下,我们在做下载操作时,会放到线程里进行实现的。为了实现可以在下载的同时又操作其他显示页面。做到了互不干扰。
针对这样的功能,我们需要采用QT中一个比较方便的开线程方式:QtConcurrent::run
QFuture<bool> future = QtConcurrent::run(this, &EachEvaluationWidget::ThreadDownLoadFiles);
while (!future.isFinished())
{
QApplication::processEvents(QEventLoop::AllEvents, 100);
}
具体的详细使用规则不再过多说明了,之前就有更新过,如果有不了解的,可以去查看哦~
使用HTTP通讯下载的同时实时进行页面展示的功能就更新到这里啦~
我是糯诺诺米团,一名C++开发程序媛~