delphi 多个线程 多个进度条_裤子都脱了却卡在99%,进度条卡住该怎么办?

0109778fc7fa87af8a362e57ec63a6f0.png

我们一生都在等待,等一辆车、等一个人、等一次机会和无数卡在 99% 的进度条。好像从 Windows 拥有第一个 GUI 开始,进度条就出现在我们的生活中。

它们就像是患有拖延症的朋友,总是告诉你“快好了,再等一下,再 1 秒钟就好”,实际上可能永远也等不到。我 TM 裤子都脱了你卡在 99% 是几个意思?

进度条的依据

进度条可以是百分比,也可以是一根逐渐充满的方块,它的显示依据是根据程序设定的某种标准。

比如当我们复制共 70GB 的 100 个文件,每个文件大小不一样,我们可以把每个文件作为 1%,完成一个文件进度条就涨 1%。或者将 70GB 作为整体,每复制 0.7GB 就让进度条涨 1%。

3c4e06109f235a73bb8592c80920c5b5.png

如果采用第一种标准,那么进度条的增长就不会平缓,比如前 10 个文件加起来只有10MB,进度条一瞬间就能冲到 10%,但是第 11 个文件有 10GB,就要卡很久才能从 10% 到 11%。

这样看来似乎第二种标准更加合理?但也有存在很多问题,复制单个大文件过程是连续的,用从 0 MB/s 加速到 100 MB/s 直到写入完成。

但遇到多个小文件时过程就会中断,速度还没拉满就完成了一个文件,下一个文件又从 0 开始加速,永远达不到峰值速度。所以我们复制文件的时候会发现有时候波浪很平稳(大文件),有时候不断上下波动(多个小文件)。

cedf749f10ac78f77da7da7f85bb3c8a.png

计算机的不可抗力

除了文件本身存在不可估量外,更多的原因来自外界的不可抗力。虽然我们都说计算机是绝对精准的,但实际上计算机内部一片「混乱」。当我们在写入文件的时候会占用系统资源,如果这时候系统资源被别的程序抢去,写入速度自然会降低,进度条就不准了。

73b8dc551c79b76da3de81d176956279.png

再比如王者荣耀比赛载入的时,每位选手都有一个百分比进度条,实际上这个百分比也是预估值,因为游戏服务器的反馈时间往往是不确定的。其他网络服务的进度条也大多是同理。

不过下载大文件时进度条通常比较精准,因为总量一开始就确定,网络没有波动时只需 总量/下载速度 即可计算出剩余时间。

但对于 P2P 可能就不太实用了,都知道 P2P 是大家组成一个网络,所有人都分享自己的网络作为服务器,以达到「共同富裕」的目的。但就像聚会一样,参与人数越多,变数就越大。

e07cd0304ac847e3ec30ae58bc774b3d.png

如果有人退出共享网络,就会影响大家的下载速度。你这边还在下载,对面老哥已经提上裤子关了电脑,这也怨不得下载软件。而卡在 99% 的原因主要有两点:

1、现在下载很多下载都采用多线程,相当于把一个文件拆成多个独立的任务,将这些任务分给每个线程,全部下载完成后再组装成一个完整的文件。

但每个线程的速度却不一样,勤快的线程早早完成任务去睡觉了,而有一个很懒的线程一直磨洋工,大家都得等着它完成才能组成完整的文件,这就导致 99% 卡很久。

3c66398d6d063bd515e2f7a57d3d7e6b.png

2、最后1%其实在「验证文件完整性」,以确保文件是正确可用的,这一步可能需要很长时间,甚至下载程序直接卡死也是常有的事。其实这时候关闭下载程序,将下载文件后缀改为原本的后缀依然能够打开。

进度条的意义

其实进度条本质上只有完成和未完成两种状态。因为无法估量,很多程序员干脆自暴自弃,弄个假的进度条,为了逼真还把加载速度弄得不平稳,一跳一跳的,祈祷能在 99% 之前完成加载,实际上这就是个动画片。如果99% 都没加载完,就只能卡在那里。

2117d429bd8130005bc56c31530d1438.png

这也侧面看出,进度条的主要目的可能并不是精准汇报工作进度。更多时候进度条是为了缓解用户焦虑,让用户心里有底,感觉一切都在掌控之中。

就像很少有人发现某些电梯的关门键只是个摆设,但疯狂按电梯关门键确实可以缓解焦虑,当电梯门合上的时候用户会以为是他们的功劳。

想象一下如果王者荣耀没有载入进度条,大家会怀疑是不是自己卡住了?还需要等多久?我能不能去上个厕所?这样就可能导致用户因为焦虑而退出游戏。

往往进度条是加载时界面中唯一活动的元素,如果进度条在动,说明程序还在工作,没有死机。避免了用户反复点击请求导致的程序崩溃。

cba3e8f66ca2508c57c188cec637082b.png

没有设定总量的软件下载

所以就出现了转菊花的情况,连个百分比都没有,只是证明程序还在工作,至于多久完成?骗都懒得骗一下。

3d74bd345dd77b113da044fd7e555263.gif

进度条确实像一个有点傻但很好心的朋友,陪我们一起度过漫长的载入时间……

18365045a163dd763726fb042c34f72d.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值