定时器自行停止

时间:2011-03-09 22:07:32

标签: delphi timer

我在我的软件中使用TTimer,它应该全天候运行。我的软件中没有任何地方禁用或停止运行计时器。它的主要功能是更新表的值。它在软件运行后立即启动,从那时起,TTimer就不应该停止。然而,在跑了一个多月后,TTimer神秘地停止了运行。该软件在Windows 7上运行,该软件在Delphi 2010 XE上开发。我搜索了我的代码以查看可能导致它的原因,但我无法弄清楚是什么。

 Timer1.Enabled:=true;

这就是计时器的启动方式。

更新: 在做了一些调查后,我发现TTimer从未停止过,但还有另一个问题。 TForm上的TStringGrid表只是不显示任何更新的值。此外,我还发现我用于存储数据项列表的我的TList列表正在以某种方式被破坏列表变空。但只有在程序启动时才加载列表中的数据项。

每次我更新表单上的TStringGrid时,我都会通过我的TList项目从0到count-1位置。因此,如果内存中的TList中没有项目,我的代码就会跳过 在显示部分上,因此TStringGrid上没有任何更新。

类似的东西:

If (List.count>0) then 
begin
//Display values in TStringGrid; 
end;

但是当软件仍在运行时,我能够从文件中重新加载我的项目列表 回到TList列表,我的软件开始像它想象的那样工作。

我不想说最丑陋的程序员最讨厌这个词。我恐怕可能有内存泄漏。有谁这么认为?

任何帮助将不胜感激。感谢。

4 个答案:

答案 0 :(得分:5)

我打赌它会在重启后49天停止。当Windows GetTickCount回绕时。当然你没有根据这个做出失败的支票吗?

答案 1 :(得分:1)

TTimer只是Windows SetTimer() API的一个包装器,我相信它会永远运行。

我怀疑计时器仍在运行,但它触发的事件处理程序无法按预期运行。

答案 2 :(得分:0)

我不确定为什么它会在一个月后停止;我怀疑(正如Erik所说的)你有一些使用GetTickCount()的东西在绕过大约49天后失败了。

作为一般规则,最好停止/启动计时器以防止延迟导致计时器消息被丢弃:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  try
    // Do whatever on timer event firing
  finally
    Timer1.Enabled := True;
  end;
end;

你可以试试这个而不是让它不断运行;如果它是TTimer代码中的错误(在快速扫描XE的TTimer实现后我没有看到任何内容),停止和启动可能会重置以防止失败。

答案 3 :(得分:0)

您应该在作业完成后释放分配的内存:

Timer1.FreeOnRelease().Free();