Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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