下载
GitHub 源码地址
如果访问不到的话,可以从百度盘下载:
链接:https://pan.baidu.com/s/1bK4sug-eK85fmPgi9DzhcA
提取码:0vp3
文件:VB.Equal.Timer-VB计时器软件-绿色无残留
写在前面
转眼也工作了两年了,从大学毕业就再也没正经写过CSDN,到时工作以来的工作日志没有间断,甚至一开始连中午吃啥都记得明明白白,从今天开始希望经常搞点 “事情”,并且整理出来,看我都能编些什么软件。
1、奇葩的起因
计时器应用是在大学时做的,最后一次修改vb的源码是13年6月16日,做这个应用的原因是当时的课前演讲让我计时,我在对自己班同学轮番放水后,实在是无法拒绝其他班的同学的放水请求,所以就做了一个计时器,从此也把我从计时这件事情上解脱了下来……
2、简单的需求
软件最初设计的非常简单,因为需求就很简单:5分钟倒计时……
不过也就在那阶段,我也是不断地对其进行修改,前前后后居然修改出了64次版本,现在想想那时候也真是执着。
3、我觉得所谓的难点
当时对软件开发还是比较懵懂无知的,都是想一步是一步,再加上那时候重度强迫症,更是纠结,其实整个软件核心部分就是计时,如何计时准确是成功的关键,我也曾在网上找过其他计时软件,有的很明显就是……
Sleep(1000);
这样计时会有比较大的偏差、因为软件运行还有时间,再加上Sleep的时间,运行越久误差越大,我使用的是运行前和运行后的时间戳差的方式,来记录经过的时间,如下:
Private Sub Timer_F_Timer()
'这里获取当前的时间'
GetLocalTime t'如果当前时间比上次记录的时间大'
If t.wMilliseconds > time_mark_time Thentime_stepcha = t.wMilliseconds - time_mark_time
Else'这里处理用户人为修改日期时间,造成当前时间小于上次记录时间的情况'
End If'如果时间差比剩余时间大,就继续减'
If TIMEMS > time_stepcha ThenTIMEMS = TIMEMS - time_stepcha
Else'如果剩余时间小于时间差,那么就说明时间到了'
End If'这里可以进行时间的显示'
'这里记录一下当前时间,下次循环备用'
time_mark_time = t.wMilliseconds
End Sub
其实也并不复杂,这样就可以完美覆盖每一次循环,不会再出现Sleep那样的误差,至于循环时的时间显示,可以按照自己希望的格式来实现,刷新的频率可以控制循环的间隔,基本就OK了。
这个时间的算法后来我在一次考试项目中也用到了,不过是用JS实现的,也差不多,在文章最后附的源码里,有网页版的源码。
4、一些程序中的截图
主界面
选项菜单
软件说明
请高人不吝赐教。