Delphi Timer: время до следующего события

Можно ли определить, когда будет запущен TTimer в Delphi? Я знаю, как рассчитать это на основе последнего запуска таймера и интервала таймеров. К сожалению, код, с которым я работаю, имеет много состояний, и интервал может изменяться разными способами. Я бы предпочел не отслеживать, когда таймер был активирован в последний раз и интервал изменился, а вместо этого напрямую обращаться к этой информации из таймера.

Сценарий: таймер имеет 2-минутный интервал, 30 секунд прошло с момента его последнего включения. Как узнать в коде, что через 90 секунд событие таймера снова сработает?

Можно ли получить эту информацию из таймера напрямую? Или, может быть, ОС? Компонент таймера должен "знать", когда он будет запущен следующим. Как это узнать? Доступна ли эта информация?

2 ответа

Решение

Нет абсолютно никакого способа запросить таймер Windows для получения информации такого рода. Вам просто придется следить за этим самостоятельно.

Я бы сделал это, завернув TTimer с составом а не наследством. После этого вы можете быть уверены, что запечатлете все изменения в состоянии таймера.

В этом случае я рекомендую вам переключиться с TTimer, который использует таймеры Windows, на компонент в стиле потока, основанный на TTimer. Затем вы можете запросить время до следующего события.

Альтернатива; Если вы хотите простой уродливый взлом, то измените интервал таймера на 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. Реальный опыт показывает, что WM_TIMER должен использоваться только для вещей, которые вообще не должны происходить, и должен использоваться для удобства, а не как система с жестким временем.

Другие вопросы по тегам