发表于:2005-12-05 13:13:00
楼主
用VB进行时间累计的问题及解决方法
实现对系统启动时间的累计,功能看起来很简单:只要用系统时间减去起动时的系统时间便等于本次机组运行的时间,加上以前累计运行的时间便等于机组累计运行的时间,待停机信号出现将累计运行时间存盘即可以了。
但在程序编制调试的过程中却发现了问题:
1.如果在运行过程中,用户修改了系统时间,将会导致当前时间-起动时系统时间非常大甚至出现负值而使机组累计运行时间不准;
2.在VB中的时间0值是1899年12月30日上午12时0分0秒,所以1秒钟显示为:“1899/12/30 12:00:01 AM”这显然不是我们所需要的;
3.在VB的时间类型的变量或常量中年、月、日中任何一位都不可为0,否则将要出错;
4.如果在运行过程中,计算机死机或出错,导致本次运行时间未及时存盘而造成机组累计运行时间不准。
解决方法:完成计时功能首先应声明三个变量:
静态变量T1,用来存放每一次计算累计时间TL时的系统时间,即累计时间基准
变量 TL,用来存放累计运行时间
变量 T2,用来存放系统当前时间
实现此功能的正常思路:在运行过程中机组状态由“非运行”转为“运行”此时程序将保存当前时间到一个静态变量T1(假设为2000/12/20 00:00:00)中,而运行一段时间后,程序将当前系统时间T2( 假设为2000/12/20 00:20:00与刚刚保存的T1的差(00:20:00)做为此次机组运行的时间。
由于Windows操作系统是个多任务的操作系统,在程序运行过程中可能出现这样的情况,即在程序保存T1之后,用户通过其他程序修改了系统时间(假设修改为 1998/12/20 00:20:00)在程序运行时统计运行时间就会出现T2-T1<0的情况,而VB中负的时间值会解释为1899年以前的日期,这样T2-T1就等于1897年12月30日00:00:00程序显示的时间就会显示错误的累计时间。
为防止在运行过程中,用户修改系统时间,导致当前时间与起动时系统时间之差在合法范围之外而使机组累计运行时间不准的问题。程序每隔1秒钟令T2=系统当前时间,计算T2-T1,如果T2-T1所得到的值在0~6秒内将该值累加到累计时间TL中,无论T2-T1的值如何,都令T1=T2。这样时间基准T1每秒都要更新一次这样,由于T1每秒钟更新一次,所以,无论在程序运行中用户将时间修改成什么值只会造成程序累计时间上的1秒钟的误差。
另外,在VB中的时间类型的0值是1899年12月30日上午12时0分0秒,所以1秒钟显示为:“1899/12/30 12:00:01 AM”并且年、月、日位不能等于0,这显然与我们需要的不符合。
为解决这一问题,先对VB的数据类型进行深入一些的了解。
VB中的时间类型变量存储为 IEEE 64 位(8 个字节)浮点数值形式,其可以表示的日期范围从 100 年 1 月 1 日到 9999 年 12 月 31 日,而时间可以从 0:00:00 到 23:59:59,当其他的类型的数据要转换为时间类型时,小数点左边的值表示日期信息,而小数点右边的值则表示时间。午夜为 0 而中午为 0.5。负整数表示 1899 年 12 月 30 日之前的日期,所以在VB中1秒的时间转化为浮点型数的值为1÷24÷60÷60=1.15×10-5应用此值可以先在程序中将时间变量换算为浮点型变量,再将浮点型变量除以1.15×10-5得到累计的秒数再进行分钟和小时的换算,因为机组累计运行时间是以小时为最大单位的,所以不需要进行年月日的换算。这种方法缺点是计算比较复杂,并且1秒钟对应1.15×10-5有误差,误差累加容易造成累计时间上的误差。
最后,采取了用数据结构方法解决时间问题,即定义数据结构新类型如下:
TYPE TIMEL
THOUSE AS LONG
......