Таймер Delphi: время до следующего события
Можно ли определить, когда будет запускаться TTimer в Delphi? Я знаю, как рассчитать это на основе последнего прогона таймера и таймера. К сожалению, код, с которым я работаю, имеет много состояний, и интервал может меняться разными способами. Я бы предпочел не следить, когда последний был включен, а интервал изменился, а вместо этого напрямую получил доступ к этой информации из таймера.
Сценарий: таймер имеет 2-минутный интервал, 30 секунд истек, так как он был последним включен, как узнать код, который через 90 секунд снова запустится событие таймера?
Можно ли получить эту информацию непосредственно из таймера? Или, возможно, ОС? Компонент таймера должен "знать", когда он будет запущен следующим образом. Как это знать? Доступна ли эта информация?
Ответы
Ответ 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 следует использовать только для вещей, которые вообще не нужны, и их следует использовать как удобство, а не как систему с жестким временем.