是否可以确定Delphi中的TTimer何时触发?我知道如何根据计时器的上次运行和计时器间隔计算出来。不幸的是,我正在使用的代码有很多状态,并且间隔可以在很多方面改变。我宁愿不必跟踪上次启用计时器和更改间隔的时间,而是直接从计时器访问此信息。
场景:计时器有2分钟的间隔,自上次启用以来已经过了30秒,如何在代码中找出计时器事件将在90秒内再次触发?
是否可以直接从计时器获取此信息?或者OS?计时器组件必须“知道”下一次触发它的时间。怎么知道的?我可以访问这些信息吗?
答案 0 :(得分:15)
绝对没有办法查询Windows计时器以获取此类信息。你只需要自己跟踪它。
我会通过使用合成而不是继承来包装TTimer
来实现此目的。然后,您可以确保捕获对计时器状态的所有修改。
答案 1 :(得分:4)
在这种情况下,我建议您从使用Windows计时器的TTimer切换到thread based TTimer-style component。然后你可以查询下一个事件的时间。
替代;如果你想要一个简单的丑陋黑客,那么将你的计时器间隔改为1秒而不是120秒,并自己做倒计时:
const
CounterPreset = 120;
...
procedure TForm1.FormCreate(Sender:TObject);
begin
FCounter := CounterPreset;
Timer1.Interval := 1000;
Timer1.Enabled := true;
end;
procedure TForm1.Timer1Timer(Sender);
begin
Dec(FCounter);
if (FCounter<=0) then
begin
DoRealTimerCodeHere;
FCounter := CounterPreset;
end;
end;
function TForm1.TimeLeft:Integer;
begin
result := FCounter;
end;
根据WM_TIMER消息的限制,这将是不准确的,仅在MSDN here上模糊地记录。实际经验表明,WM_TIMER应该只用于根本不需要发生的事情,应该用作方便,而不是硬定时系统。