如何根据加载进度制作进度条
如题,怎么样根据当前程序的加载进度来确定进度条的进度?原理是什么?怎么实现?
我在网上搜到的大部分是每隔一个固定时间就增加一个固定的进度值,这样的话进度条好像就没有什么实际意义了吧,不能反映实际的程序加载情况。
而且大部分都是直接使用的进度条控件,呃,那东西实在是太丑了,我打算自己绘制进度条,不用系统的进度条,采用Win32 API实现,要准备两张图片来进行叠加我知道,但是不知道怎么实时反映程序的加载进度,以前写程序都比较小,最近写了个相对来说稍微大了点的程序,资源比较多,程序在运行时启动、切换都有一些延迟,所以想用进度条来遮掩,有没有人知道该怎么去做? API win32 C\C++ 进度条
[解决办法]
进度每隔比如1秒进多少可以是一个动态调整的步进值。
开始时(0%到5%)可以选一个固定进度步进值,边前进边重新估算下一步的步进值,通常到20%以后,这个步进值就比较接近实际值了。
[解决办法]
那是个设计模式的例子而已。 总量和已经完成量很难估算的时候, 显示“正在加载”就好了。
[解决办法]
只是下载文件的时候是可以及时获取真实的信息的,我上面已经说了,
把下载好的文件更新程序的这个实时的进度获取不到的,只能模拟了,不是真实值的!
[解决办法]
一般情况下进度条实际上是起示意作用,告诉用户程序没有卡死,一切正常。因而大多数进度条不需要特别准确,意思一下即可。如果lz的延迟时间比较短,几秒的话,进度条分隔成三、四段即可,太细的话反而效率低下。
有两种思路:
1、估计总的秒数t,设个定时器,每 t/3 秒刷新一次。可能最后一段会显得不“均匀”,但实际上无所谓。
2、如果加载的过程是顺序执行一些函数,则可分为3段,其间插入刷新进度条的语句
//begin to load
function1();
SendMessage(hProgress,33,...);
function2();
SendMessage(hProgress,66,...);
function3();
SendMessage(hProgress,100,...);
//loading ends
同样只要大体均匀即可,相信没有用户会无聊到掐秒表的。
PS:玩魔兽3,在加载地图的时候,我就发现进度条好像仅分成三段,在不均匀的三次移动后还要卡一会才进游戏。这么多年来早已习惯,也不觉有什么大不了的。