Принципы работы TTimer

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Принципы работы TTimer

Сообщение xchgeaxeax » 03.10.2024 21:16:54

Alex2013 писал(а):Application.ProcessMessages? (while iWait > GetTickCount64 do begin Application.ProcessMessages; Sleep(10); end)

Все верно. Я уже говорил, что это таймеры, которые работают на обработке очереди сообщений ветви и свои события о срабатывании они добавляют именно в нее. А из очереди это событие достает диспетчер (DispatchMessage). Но, если используете указатель на процедуру, то событие будет сразу направляться в эту процедуру. А вот повторное срабатывание будет добавляться уже в очередь сообщений и оттуда их достанет уже диспетчер.

Но надо понимать, что все это просто забивает стек программы и все эти запуски (iHits > 1) должна завершиться. Иначе вы получите рано или поздно ошибку Stack overflow/Access violation.

Добавлено спустя 4 минуты 5 секунд:
Именно поэтому (чтобы закончить цепочку запусков) в позапрошлой программе с TTimer я использовал задержку внутри обработчика, которая уменьшается с каждым iHits

Код: Выделить всё
  if iWait < 10 then iWait := 10;
  inc(iWait, GetTickCount);
  while GetTickCount < iWait do begin // При первом входе в процедуру задержка 1400мс, при втором 1300мс итд минимальная 10мс.
    Sleep(10);
    Application.ProcessMessages;
  end;
xchgeaxeax
постоялец
 
Сообщения: 125
Зарегистрирован: 11.05.2023 03:51:40

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 15

Рейтинг@Mail.ru