德尔福计时器:下一个事件之前的时间

时间:2011-08-31 21:13:26

标签: delphi timer

是否可以确定Delphi中的TTimer何时触发?我知道如何根据计时器的上次运行和计时器间隔计算出来。不幸的是,我正在使用的代码有很多状态,并且间隔可以在很多方面改变。我宁愿不必跟踪上次启用计时器和更改间隔的时间,而是直接从计时器访问此信息。

场景:计时器有2分钟的间隔,自上次启用以来已经过了30秒,如何在代码中找出计时器事件将在90秒内再次触发?

是否可以直接从计时器获取此信息?或者OS?计时器组件必须“知道”下一次触发它的时间。怎么知道的?我可以访问这些信息吗?

2 个答案:

答案 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应该只用于根本不需要发生的事情,应该用作方便,而不是硬定时系统。