vb 定时器不准问题讨论

时间:2021-10-29 20:23:57
最近发现vb的定时器不准 
我用如下代码测试 

Dim t1, t2 As Long 
Private Sub Form_Load() 
    Timer1.Interval = 1000 
    Timer2.Interval = 1 
    Timer1.Enabled = True 
    Timer2.Enabled = True 
End Sub 

Private Sub Timer1_Timer() 
    t1 = t1 + 1 

    If t2 = 1 Then 
    Stop 
    End If 

    Debug.Print "t1=" 
    Debug.Print t1 
End Sub 

Private Sub Timer2_Timer() 
    t2 = t2 + 1    Debug.Print "t2=" 
    Debug.Print t2 
End Sub 
俩个代码运行结果如下 
…… 
t2= 
59 
t2= 
60 
t2= 
61 
t1= 

也就是说Timer2无法定时到1个毫秒 
而且当设置 
    If t2 = 1 Then 
    Stop 
    End If 

测试结果如下 

…… 
t2= 
123 
t2= 
124 
t2= 
125 
t1= 

说明定是定时不准 

问题:如何在vb中精确定时到1ms? 
    希望各位大师能出出主意。。。

8 个解决方案

#1


timer不准的原因:
机器执行代码需要时间,执行其他程序会耽搁触发

不要用累加,在触发时直接调用系统时间会好些

#2


我的是
t2= 
69 
t1= 

也就是说要1秒内打印1000条记录,电脑不可能反应那么快吧;
另外,电脑配置不一样结果都不一样.

#3


呵呵 谢谢各位
我主要是用timer定时器做精确定时,看来只有放弃了,不过我找到一个更好的方法
就是用 API 函数timeSetEvent实现比较精确的定时

#4


Timer2.Interval = 1 
1是0.001秒啊,这个电脑做不到的。
换个思路吧

#5


Timer计时器精度见MSDN:
使用 Timer 控件
Timer 控件响应时间的流逝。它们独立于用户,编程后可用来在一定的时间间隔执行操作。此控件的一个一般用处是检查系统时钟,判断是否该执行某项任务。对于其它后台处理, Timer 控件也非常有用。
每个 Timer 控件都有 Interval 属性,指定定时器事件之间的毫秒数。除非禁止此属性,否则定时器在大致相等的时间间隔不断接受事件(称作定时器事件会更贴切)。
在为 Timer 控件编程时应考虑对 Interval 属性的几条限制: 
如果应用程序或其它应用程序正在进行对系统要求很高的操作─ 例如长循环、高强度的计算或者正在访问驱动器、网络或端口─ 则应用程序定时器事件的间隔可能比 Interval 属性指定的间隔长。
间隔的取值可在 0 到 64,767 之间(包括这两个数值),这意味着即使是最长的间隔也不比一分钟长多少(大约 64.8 秒)。
间隔并不一定十分准确。要保证间隔准确,应在需要时才让定时器检查系统时钟,而不在内部追踪积聚的时间。
系统每秒生成 18 个时钟信号─ 所以即使用毫秒衡量 Interval 属性,间隔实际的精确度不会超过 18 分之一秒。 

#6


VB定时器的精度最高是:1/18s

#7


是的,执行代码慢了

#8


VB定时器的精度最高是:1/18s

#1


timer不准的原因:
机器执行代码需要时间,执行其他程序会耽搁触发

不要用累加,在触发时直接调用系统时间会好些

#2


我的是
t2= 
69 
t1= 

也就是说要1秒内打印1000条记录,电脑不可能反应那么快吧;
另外,电脑配置不一样结果都不一样.

#3


呵呵 谢谢各位
我主要是用timer定时器做精确定时,看来只有放弃了,不过我找到一个更好的方法
就是用 API 函数timeSetEvent实现比较精确的定时

#4


Timer2.Interval = 1 
1是0.001秒啊,这个电脑做不到的。
换个思路吧

#5


Timer计时器精度见MSDN:
使用 Timer 控件
Timer 控件响应时间的流逝。它们独立于用户,编程后可用来在一定的时间间隔执行操作。此控件的一个一般用处是检查系统时钟,判断是否该执行某项任务。对于其它后台处理, Timer 控件也非常有用。
每个 Timer 控件都有 Interval 属性,指定定时器事件之间的毫秒数。除非禁止此属性,否则定时器在大致相等的时间间隔不断接受事件(称作定时器事件会更贴切)。
在为 Timer 控件编程时应考虑对 Interval 属性的几条限制: 
如果应用程序或其它应用程序正在进行对系统要求很高的操作─ 例如长循环、高强度的计算或者正在访问驱动器、网络或端口─ 则应用程序定时器事件的间隔可能比 Interval 属性指定的间隔长。
间隔的取值可在 0 到 64,767 之间(包括这两个数值),这意味着即使是最长的间隔也不比一分钟长多少(大约 64.8 秒)。
间隔并不一定十分准确。要保证间隔准确,应在需要时才让定时器检查系统时钟,而不在内部追踪积聚的时间。
系统每秒生成 18 个时钟信号─ 所以即使用毫秒衡量 Interval 属性,间隔实际的精确度不会超过 18 分之一秒。 

#6


VB定时器的精度最高是:1/18s

#7


是的,执行代码慢了

#8


VB定时器的精度最高是:1/18s