关于Timer的问题

abcii 2008-12-25 05:08:21
举个极端的例子

timer的Interval属性设置为 1ms

而Timer里的代码执行需要 10 s

就是说执行时间 大于 触发时间。

这样,是等执行完代码 等待1ms再开始下一次呢
还是在执行过程中暂停,直接执行新代码?

貌似后者有点不可能阿,程序全乱套了
...全文
458 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
abcii 2008-12-27
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 PctGL 的回复:]
无视我这个没星星的小三角。。。bs csdn...
[/Quote]

这些问题 比代码 更不容易让人理解....
^_^
PctGL 2008-12-27
  • 打赏
  • 举报
回复
无视我这个没星星的小三角。。。bs csdn...
abcii 2008-12-27
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 PctGL 的回复:]

no。。。

这不仅不是bug,而且很正常,原因应该在于消息机制而非 timer控件
实际上,vb还有意禁止了 timer控件的异步,特别在IDE的情况下
但这个异步也是可控制的

而msdn里面也没有对我的问题的正面回答
唯一涉及到的是:“如果应用程序或其它应用程序正在进行对系统要求很高的操作─ 例如长循环、高强度的计算或者正在访问驱动器、网络或端口─ 则应用程序定时器事件的间隔可能比 Interval 属性指定的间隔长。”…
[/Quote]

看来你看得更清楚啊.

问题有了答案,分给你吧,虽然没多少^_^

谢谢,以后还有问题要请教呢
zdingyun 2008-12-27
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 abcii 的回复:]
引用 14 楼 zdingyun 的回复:
LZ:建议你好好看看MSDN给出的解释,并仔细观察我在8楼处贴出的代码。有些问题是靠悟性来领会的,依据代码试验运行的结果来解释的。


哥们,你还没理解我的意思,你的代码还是在验证 Timer对时间控制的准确性

这点我是知道

你是答非所问。。。。

而msdn里面也没有对我的问题的正面回答
唯一涉及到的是:“如果应用程序或其它应用程序正在进行对系统要求很高的操作─ 例如长…
[/Quote]
无语!???LZ钻进牛角了


PctGL 2008-12-27
  • 打赏
  • 举报
回复

no。。。

这不仅不是bug,而且很正常,原因应该在于消息机制而非 timer控件
实际上,vb还有意禁止了 timer控件的异步,特别在IDE的情况下
但这个异步也是可控制的

而msdn里面也没有对我的问题的正面回答
唯一涉及到的是:“如果应用程序或其它应用程序正在进行对系统要求很高的操作─ 例如长循环、高强度的计算或者正在访问驱动器、网络或端口─ 则应用程序定时器事件的间隔可能比 Interval 属性指定的间隔长。”

其实这个解释起来很麻烦,根本原因还是消息机制的问题
消息循环在冻结的情况下,以上msdn说的情况都是消息循环可能被冻结的情况,这些情况发生时,timer事件
并不是没有接受到,而是丢失了,因为代码没有时间处理那些事了,他被锁定在某个特定的代码中,无法以
异步的方式,跳出那个循环,来执行timer,异步是必须的,timer本身运行的方式就是异步

....则应用程序定时器事件的间隔可能比 Interval 属性指定的间隔长
这就是因为事件丢失,所导致的出现间隔更长的原因
abcii 2008-12-27
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 PctGL 的回复:]


晕,那我说的呢? 我说的好像很明白吧,告诉你是会的
[/Quote]

呵呵,我正在研究你说的^_^

你的意思我懂了,如果函数体运行需要很长时间,会出现 异步

就是说 它不会等函数体执行完再计时,而是停止当前过程,直接重新开始


如果是这样,那我觉得这是个 timer 的 bug。如果不加以控制,会出像很多意想不到的错误。。。

而且了解这点后,这个timer控件 不算是一个 好的控件。。。
noenoughmemory 2008-12-27
  • 打赏
  • 举报
回复
mark
abcii 2008-12-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zdingyun 的回复:]
LZ:建议你好好看看MSDN给出的解释,并仔细观察我在8楼处贴出的代码。有些问题是靠悟性来领会的,依据代码试验运行的结果来解释的。
[/Quote]

哥们,你还没理解我的意思,你的代码还是在验证 Timer对时间控制的准确性

这点我是知道

你是答非所问。。。。


而msdn里面也没有对我的问题的正面回答
唯一涉及到的是:“如果应用程序或其它应用程序正在进行对系统要求很高的操作─ 例如长循环、高强度的计算或者正在访问驱动器、网络或端口─ 则应用程序定时器事件的间隔可能比 Interval 属性指定的间隔长。”

还没听懂我的问题吗??

在timerX_timer执行的时候, 是 1从开始计时 过interval时长,不理会函数体有没有执行完就 开始下一次,
还是 2等函数体执行完,开始计时 再等interval时长,在开始下一次。

到底是以1or2 哪种情况运行的? 如果是 2 就可以解释msdn 上面的那句话,就是定时器事件的时间间隔 除了本身的误差(你所说的那个),其实是interval+ 函数体执行时间。。。。

而你说的试验问题,这是由于你说的interval的误差问题 而没有确切的答案。
PctGL 2008-12-27
  • 打赏
  • 举报
回复


晕,那我说的呢? 我说的好像很明白吧,告诉你是会的
abcii 2008-12-27
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 Tiger_Zhao 的回复:]
VB codePrivate Sub Timer1_Timer()
Timer1.Enabled = False
较长的执行过程
Timer1.Enabled = True
End Sub
[/Quote]

你的代码好像是间接回答了我的问题吗?

你的意思 代码“较长的执行过程” 没执行完的时候,timer1会不理会这种情况,再次触发吗?

而且你给了解决办法。

问题是实际情况是不是这样的,我觉得这样会引起很严重的混乱。。。
abcii 2008-12-27
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zzhgb 的回复:]
如果要执行完了在等10s可以这样
Option Explicit
Dim strTime As String

Private Sub Form_Load()
strTime = Now
Timer1.Interval = 100 '精度
End Sub

Private Sub Timer1_Timer()
If DateDiff("s", strTime, Now) >= 10 Then
'(略)功能代码
strTime = Now
End If
End Sub
[/Quote]

谢谢您的好意,不过你肯定没运行过这段代码,timer1_timer根本就不会运行,少个.enable=true
^_^
而且你理解错了我的意思,你的那段代码实现的东西不需要那么复杂,直接.interval=10*1000,Timer1_timer里面直接写功能代码和你的那段是一样的
zdingyun 2008-12-26
  • 打赏
  • 举报
回复
LZ:建议你好好看看MSDN给出的解释,并仔细观察我在8楼处贴出的代码。有些问题是靠悟性来领会的,依据代码试验运行的结果来解释的。
PctGL 2008-12-26
  • 打赏
  • 举报
回复
[Quote]
timer 在执行完代码后再开始计时interval呢,还是timer触发还未执行就开始计时?如果执行的时间大于interval会发生什么?等执行完在下一次还是 直接停下来马上进行触发新的timer函数体?
[/Quote]

未执行完就开始执行下一次的函数,这将会行成一个异步,而且如果第2次运行时,第1次代码运行未完成
可能导致第一次的代码永远不会被运行完,直至timer被销毁

也就是说,当timer第一次执行某函数时,虽然函数未执行完,但timer也是从新开始计时,当时间到达时
就会再次启动函数执行。
不过这些都是可以通过代码控制的,可以做到允许异步和禁止异步,可以参考 pctgl.vbgood.cn 我写的对
异步的一点研究,里面的代码用settimerapi实现的timer,正好可以用来说明你想知道的问题
abcii 2008-12-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 huyongsc 的回复:]
将Interval值设置大点,你设置小于执行代码时间就没有意义了。
[/Quote]

问题就是怎么没意义了?

为什么没意义了?

到底怎么执行了
abcii 2008-12-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 huyongsc 的回复:]
将Interval值设置大点,你设置小于执行代码时间就没有意义了。
[/Quote]


问题是怎么没意义了?

为什么这样就没意义了呢?
abcii 2008-12-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zdingyun 的回复:]
引用 4 楼 zdingyun 的回复:
1)使用Timer控件,即使你设置其Interval为1ms,实际执行是55ms,见MSDN:
使用 Timer 控件
Timer 控件响应时间的流逝。它们独立于用户,编程后可用来在一定的时间间隔执行操作。此控件的一个一般用处是检查系统时钟,判断是否该执行某项任务。对于其它后台处理, Timer 控件也非常有用。
每个 Timer 控件都有 Interval 属性,指定定时器事件之间的毫秒数。除非禁止此属性,否则定时器在大致相等的…
[/Quote]

谢谢这位兄弟。。。。


不过不是我要的答案阿,1ms是我举的一个极端的例子,重新举例:执行代码需要10s,而interval设为 1s即1000ms。

我的意思是:timer 在执行完代码后再开始计时interval呢,还是timer触发还未执行就开始计时?如果执行的时间大于interval会发生什么?等执行完在下一次还是 直接停下来马上进行触发新的timer函数体?

你说的是interval的精确度问题。。。。
abcii 2008-12-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 SureH 的回复:]
一开始设置1ms
然后在代码开头设置interval
等执行完代码结尾再设置interval为1ms嘛~~
[/Quote]

貌似这样可以不用解决我的问题了

但是,如果timer本身就是这样运行的,那何必在费这劲?

如果不是,就可以再想这种方法了


****回复太快!如果你是恶意刷楼,将会受到严厉惩罚****
zzhgb 2008-12-26
  • 打赏
  • 举报
回复
如果要执行完了在等10s可以这样
Option Explicit
Dim strTime As String

Private Sub Form_Load()
strTime = Now
Timer1.Interval = 100 '精度
End Sub

Private Sub Timer1_Timer()
If DateDiff("s", strTime, Now) >= 10 Then
'(略)功能代码
strTime = Now
End If
End Sub
zzhgb 2008-12-26
  • 打赏
  • 举报
回复
Option Explicit
Dim strTime As String

Private Sub Form_Load()
strTime = Now
Timer1.Interval = 100 '精度
End Sub

Private Sub Timer1_Timer()
If DateDiff("s", strTime, Now) >= 10 Then
strTime = Now
'功能代码
End If
End Sub
Tiger_Zhao 2008-12-26
  • 打赏
  • 举报
回复
Private Sub Timer1_Timer()
Timer1.Enabled = False
较长的执行过程
Timer1.Enabled = True
End Sub
加载更多回复(9)

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧