Таймеры в Дельфи - PullRequest
       30

Таймеры в Дельфи

4 голосов
/ 08 февраля 2009

Рассмотрим следующий код

Timer1 .Enabled := False;
Timer1.Interval : = 300;
For I := 1 to NumberOfTimesNeed do
Begin

   Timer1 .Enabled := False;    //  
   Timer1 .Enabled := True;     // reset the timer to 0.30 seconds

   TakesToLong     := False;
   DoSomethingThatTakesTime;    // Application.ProcessMessages is called in the procedure

   If TakesToLong = True then 
      TakeAction;
End;

procedure Timer1Timer(Sender: TObject);
begin
   TakesToLong:= True;
end;

Вопрос:

Когда я отключаю, а затем включаю Timer1 с помощью

Timer1.Enabled := False;
Timer1.Enabled := True;

Сбрасывает ли это таймер?

т.е. Это всегда будет ждать 0,30 секунды до истечения времени ожидания.

Ответы [ 3 ]

19 голосов
/ 08 февраля 2009

Да, будет. При установке значения False в False будет вызываться функция Windows API KillTimer (), если таймер был включен ранее. Если для параметра «Включено» установлено значение «Истина», функция API-интерфейса Windows SetTimer () будет вызываться, если таймер не был включен ранее.

Это стандартная идиома, которая работает со времен Delphi 1.

Однако я бы реализовал ваш код по-другому:

Start := GetSystemTicks;
DoSomethingThatTakesTime;
Duration := GetSystemTicks - Start;

if Duration > 300 then
  TakeAction;

, который будет работать без таймера и без необходимости вызывать ProcessMessages () в длительном методе. GetSystemTicks () - это функция, которую я имею в библиотеке, которая вызывает timeGetTime () в Windows и которая была реализована по-другому для Kylix (не помню как, я давно удалил этот код).

1 голос
/ 09 февраля 2009

Еще одна вещь, о которой следует помнить, это то, что таймеры - это уведомление с самым низким приоритетом в системе. Таким образом, если компьютер занят, что может включать в себя приложение, выполняющее свою работу, таймер может не сработать довольно долго. Таким образом, может пройти несколько секунд, прежде чем переменная TakesToLong будет установлена ​​в значение true, даже если таймер установлен на 300 миллисекунд.

1 голос
/ 09 февраля 2009

Я бы предложил почитать темы. Длинные действия (я не говорю, что 300 мс - это долго, но похоже, что это может продолжаться дольше), как правило, замораживают графический интерфейс и приводят к прерывистым приложениям. Теперь вы можете добавить туда application.processmessages, чтобы поддерживать работу GUI, но он может легко отбросить ваш предполагаемый стиль процедурного кодирования.

Я со стороны прохода, который считает, Application.ProcessMessages должно быть забанено , если вы не программист VB, пытающийся использовать Delphi для имитации DoEvents и вы все еще не вышли из мышления VB.

Создать поток и выполнять свою работу в этом потоке. Если вы хотите обновить GUI, когда закончите, вызовите Synchronize, чтобы «безопасно» сделать это. Передача текущего состояния назад и вперед с потоком приводит к совершенно новому разговору, который, однако, является прыжком от использования элемента управления таймером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...