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;