Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

Реализация функции Delay 2

Delphi , Синтаксис , Дата и Время

Реализация функции Delay 2

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch


procedure Delay(msecs: Longint);
 var
   targettime: Longint;
   Msg: TMsg;
 begin
   targettime := GetTickCount + msecs;
   while targettime > GetTickCount do
     if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
     begin
       If Msg.message = WM_QUIT Then
       begin
         PostQuitMessage(msg.wparam);
         Break;
       end;
       TranslateMessage(Msg);
       DispatchMessage(Msg);
     end;
 end;

 { 
  Note: 
  The elapsed time is stored as a DWORD value. 
  Therefore, the time will wrap around to zero if the system is 
  run continuously for 49.7 days. 
}

Перевод:

Процедура Delay!

Эта реализация использует функцию Windows API GetTickCount, чтобы получить текущий счетчик tick, который представляет собой количество миллисекунд, прошедших с момента запуска системы. Затем процедура enters в цикл, где она постоянно проверяет, достигнуто ли целевое время (текущий счетчик tick + желаемая задержка в миллисекундах). Если нет, она возвращает контроль обратно в очередь сообщений с помощью PeekMessage и обрабатывает любые пришедшие сообщения.

Разбивка на части:

  1. targettime := GetTickCount + msecs;: Устанавливает целевое время, добавляя желаемую задержку в миллисекундах к текущему счетчику tick.
  2. Цикл while: Продолжительно проверяет, достигнуто ли целевое время (GetTickCount > targettime). Если нет, она:
    • Использует PeekMessage, чтобы проверить наличие любых pending сообщений в очереди сообщений.
    • Если найдено сообщение, обрабатывает его с помощью TranslateMessage и DispatchMessage.
    • Если пользователь пытается закрыть приложение, закрыв окно (Msg.message = WM_QUIT), отправляет сообщение о выходе обратно в систему с помощью PostQuitMessage.
  3. Конечный break: Выходит из цикла, если целевое время достигнуто или пользователь вышел из приложения.

Обратите внимание на комментарий: есть проблема с этой реализацией - она использует DWORD-значение для хранения времени, прошедшего, что означает, что если система работает постоянно более 49,7 дней, время будет обернуться в ноль. Это может потенциально вызвать проблемы в определенных ситуациях.

Альтернативное решение с использованием WaitForSingleObject из Windows API:

procedure Delay(msecs: Longint);
begin
  WaitForSingleObject(INFINITE, msecs);
end;

Эта реализация проще и более надежна, так как она использует одиночную операцию ожидания, блокирующую до тех пор, пока не истечет указанное время или не станет сигнализироваться объект ожидания (в этом случае никогда).

В статье описывается реализация функции Delay на языке Delphi, которая откладывает выполнение кода на заданное количество миллисекунд, используя для этого цикл проверки времени и обработку сообщений о событиях.


Комментарии и вопросы


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Дата и Время ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru Rambler's Top100

Время компиляции файла: 2024-05-19 17:53:24
2024-05-20 04:03:02/0.0032970905303955/0