procedure Delay(dwMilliseconds: Longint);
var
iStart, iStop: DWORD;
begin
iStart := GetTickCount;
repeat
iStop := GetTickCount;
Application.ProcessMessages;
until (iStop - iStart) >= dwMilliseconds;
end;
Here's the translation of the text into Russian:
Классика!
Процедура Delay - простой пример реализации функции задержки в Delphi, которая приостанавливает выполнение программы на указанный количество миллисекунд.
Вот разбивка того, что код делает:
1. Он определяет две переменные: iStart и iStop, обе типа DWORD. Они будут использоваться для измерения времени, прошедшего с начала задержки.
2. Процедура начинает с вызова GetTickCount, чтобы получить текущий счетчик тиков, представляющий количество миллисекунд, прошедших с момента запуска Windows. Это значение хранится в iStart.
3. Затем процедура enters цикл, который продолжается до тех пор, пока разница между iStop и iStart (измеренная в тиках) не будет больше или равна указанному времени задержки (dwMilliseconds).
4. Внутри цикла вызывается GetTickCount, чтобы получить текущий счетчик тиков, который хранится в iStop.
5. После обновления iStop, процедура вызывает Application.ProcessMessages, чтобы обработать любые pending сообщения (например, от других потоков или окон). Это обеспечивает, что программа остается интерактивной и не блокируется.
6. Цикл повторяется до тех пор, пока условие задержки не будет выполнено.
Почему используется GetTickCount вместо простой функции сна (например, Sleep) - это потому, что приложения Delphi часто требуют поддержки интерактивности и реакции на события, такие как клики мыши или ввод клавиатуры. Вызов Application.ProcessMessages обеспечивает, что программа остается интерактивной во время задержки.
Вот альтернативное решение с использованием Sleep из Windows API:
procedure Delay(dwMilliseconds: Longint);
begin
Sleep(dwMilliseconds);
end;
Эта реализация проще и более прямолинейна, но может не быть подходящей для всех сценариев, где интерактивность критична.
Программист DeeCo представил реализацию функции Delay на языке Delphi, которая задерживает выполнение программы на указанное количество миллисекунд с помощью цикла и функции GetTickCount.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.