关于Timer的问题(100分)

  • 主题发起人 主题发起人 嘻嘻哈
  • 开始时间 开始时间

嘻嘻哈

Unregistered / Unconfirmed
GUEST, unregistred user!
假设一个Timer的interval为1000,但它的OnTimer事件需要2秒
是不是会出现这样的情况,在执行onTimer事件程序的100行时
若到了1000ms,程序回自动跳回头执行,还是执行完程序再执行。
如果是自动跳回头执行,如何避免。是设置标记吗?
有没有更好的解决方法
 
你说的这种情况,当然是程序自动跳回头执行,如果你要改变这种情况,将TTimer的
Interval改大一点就可以啦!(先估计你的程序运行完需要多少时间!)
你说的设置标记不行不通的,因为只要一满足TTimer的Interval的条件就会触发这个事件
你做什么也没用,除非(Timer1.Enable:=False)
 
我试验了一下:
新建窗口,方一个memo, checkbox, timer
checkbox1.onclick:
timer1.Enabled := checkbox1.Checked;
将timer 的 interval 设置为1,enabled := false;
timer1.ontimer:

var
i, j: integer;
begin
for i := 1 to 100 do
begin
for j := 1 to 10000000 do;
memo1.Lines.Add(inttostr(i));
end;
end;

运行程序,单击checkbox,memo中马上开始计数,即使考虑到timer的精度,
计数满100后的时间明显还是大于 timer.interval
也就是说,一次 timer.ontimer 要返回过后才会触发下一次 ontimer
因此,你的担心是多余的 :-)
 
to 江维
如果按照你说的那样,那么在memo计数到100之前肯定会开始新的计数,即:
猜想:
1
2
3
4//此处开始被中断
1//开始新一次计数
2
3
4
...实际上:
根据“实践是检验真理的唯一标准”,是事实上是计数满了100之后才开始下一次计数的,
因此程序没有自动跳回头执行,而是返回过后才会触发下一次 ontimer。
 
Timer 是利用 SetTimer,KillTimer 和一个隐含的窗口接收 WM_TIMER 消息实现的,
接收该消息到则激发 OnTimer 事件,接收消息和你的OnTimer事件处理过程都是在同一个
线程中执行的,因此它们是序列化的,不会交错执行。这也使得它不一定准时。
 
当然不会跳回去,要这一次执行完成后,才会继续
执行。也就是漏掉一些Timer事件的处理了
 
我同意bbkxy的说法,即timer的事件处理
是在程序主线程中的,即是顺序执行的。
还有不同意见吗?
 
后退
顶部