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