我在我的软件中使用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列表,我的软件开始像它想象的那样工作。
我不想说最丑陋的程序员最讨厌这个词。我恐怕可能有内存泄漏。有谁这么认为?
任何帮助将不胜感激。感谢。
答案 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();