xe10 timer定时器 运行时间 长了会 失效

aidpoint20126 2023-03-20 18:03:18
...
try
   timer1.enabled:=false;
   ......
finally 
   timer1.enabled:=true;
end;

简易代码如上,执行一段时间 后(5-10天),这个定时器就失效了,不在执行了?

求各位大神赐教,感激不尽!!!

...全文
117 6 打赏 收藏 转发到动态 举报
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

很多定器,我也是 try finally end,没有出现过你的这种情况;一般 try Tthread finally end.用线程execute,稳定些,如果需要显示就 如:

Procedure TthreadA.Execute;
begin
FreeOnTerminate := true;
Synchronize(
procedure
begin
Form1.Caption := 'Updated in thread via an anonymous method'
end
)
end

tanqth 03-21
  • 打赏
  • 举报
回复

语法中使用finally ,只是保证了出现异常时能正确执行finally 后的内容,例如释放内存等。
所以,你的代码里最好是有except的方式去捕捉异常,并完成容错处理。
还有,建议使用线程来代替定时器的方式。

  • 打赏
  • 举报
回复

如果“其他事件”是异步触发的,比如在其他线程中触发的,是可以中断timer事件的。如果是消息触发的,通常不会,因为windows的消息机制是同步的,一条消息没有处理完之前不会处理下一条消息。但是也有例外,如果在消息处理代码中又(直接或者间接)调用了GetMessage或者PeekMessage,比如调用Application.ProcessMessages,则会打断当前消息处理,转去处理其他消息。

  • 打赏
  • 举报
回复

刚发现 ,有其他事件被 触发了,也就是在执行timer事件时,又有其它事件被 触发了,这样 会不会中断timer事件呢,从而导致timer.enabled没有被true,最后timer定时器失效了 ,会不会这样?

tanqth 03-21
  • 举报
回复
@aidpoint20126 “其它事件”是什么样的事件呢?多数情况下是是会影响到定时器的处理的哈。当然,如果与定时器内部的代码有关,也是可能出现问题的。例如让代码进入了死循环,或者假死。
BlueStorm 03-20
  • 打赏
  • 举报
回复

正常情况下不会出现这个问题
你可以改为用线程的while做循环,不需要用timer了。

5,243

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告