我在我的软件中使用TTimer,它应该永远24/7全天候运行。在我的软件中,计时器没有被禁用或停止运行。它的主要功能是更新表的值。一旦软件运行,它就会启动,从那时起,TTimer上就不应该停止。然而,在运行了一个多月后,该TTimer神秘地停止运行。软件运行在Windows7上,软件在Delphi2010 XE上开发。我已经搜索了我的代码,看看可能导致它的原因,但我不知道是什么原因。
Timer1.Enabled:=true;计时器就是这样启动的。
更新:在做了一些调查后,我发现TTimer从来没有停止过,但还有另一个问题。我在TForm上的TStringGrid表根本没有显示任何正在更新的值。此外,我还发现我用来存储数据项列表的TList列表以某种方式被破坏,导致该列表变为空。但是列表中的数据项只有在程序启动时加载后才会在代码中的任何位置被删除。
每次更新表单上的TStringGrid时,我都会遍历从0到count-1位置的TList项。因此,如果内存中的TList中没有任何项,我的代码就会跳过显示部分,因此TStringGrid上不会有任何更新。
类似于:
If (List.count>0) then
begin
//Display values in TStringGrid;
end;但当软件仍在运行时,我能够将我的项目列表从一个文件重新加载到TList列表中,我的软件开始像它想象的那样工作。
我讨厌说程序员最讨厌的最丑陋的词。我担心我可能有一个内存泄漏。有人这么认为吗?
任何帮助都将不胜感激。谢谢。
发布于 2011-03-10 06:19:25
TTimer只是Windows SetTimer() API的一个包装器,我相信它会永远运行下去。
我怀疑计时器仍在运行,但它触发的事件处理程序无法按预期运行。
发布于 2011-03-10 06:09:50
我打赌它在重启49天后就会停止。当微软的GetTickCount出现的时候。确定您不会基于此进行会失败的检查?
发布于 2011-03-10 07:07:28
我不确定为什么它在一个月后停止;我怀疑(正如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实现后,我没有看到任何错误),停止和启动可能会重置设置以防止失败。
https://stackoverflow.com/questions/5252823
复制相似问题