Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Задержка [D7]


Павел ©   (2004-12-12 16:06:00) 

Здравствуйте!
Подскажите, пожалуйста, какой аналог в  Делфи Паскалевсого Delay?
Заранее благодарен за ответ.


GuAV   (2004-12-12 22:43:00) [1]

Юрий Зотов ©   (12.12.04 22:11) [14]
и самостоятельное завершение цикла по таймауту при отстутствии сообщений.


А разве этого сейчас нет ?

Юрий Зотов ©   (12.12.04 22:11) [14]
В рабочем варианте нужно предусмотреть возможность переполнения при больших GetTickCount


Так подойдёт ?
while (T - GetTickCount) > 0 and


Юрий Зотов   (2004-12-12 22:11:00) [2]

> Суслик ©   (12.12.04 17:47) [6]

Пример ЧЕГО?

Пример, который тут можно привести, уже дан в [3]. Задержка будет, сообщения обрабатываться тоже будут - но с загрузкой CPU на 98-100% (о чем и было сказано). Это плохой способ (возможно, даже ОЧЕНЬ плохой), но цели, тем не менее, он достигает.

> PZ   (12.12.04 18:46) [12]
> Вот задержка, которая не загружает процессор:

Но и не обрабатывает сообщений. То же самое делает просто Sleep.
:о)

> All

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

procedure Delay(MSec: DWORD);
var
 T: DWORD;
 H: THandle;
begin
 T := GetTickCount + MSec;
 while (T > GetTickCount) and
   (MsgWaitForMultipleObjects(0, H, False, T - GetTickCount, QS_ALLEVENTS or QS_SENDMESSAGE) <> WAIT_TIMEOUT) do
   Application.HandleMessage
end;

Примечание: код набросан "на скорую руку" и показывает лишь идею. В рабочем варианте нужно предусмотреть возможность переполнения при больших GetTickCount и самостоятельное завершение цикла по таймауту при отстутствии сообщений.


jack128   (2004-12-12 21:37:00) [3]

PZ   (12.12.04 18:46) [12]
то же самое, что и sleep, но в 8 строках место одной ;-)


PZ   (2004-12-12 18:46:00) [4]

Вот задержка, которая не загружает процессор:

procedure Delay_Wait(amSecs : Integer);
Var
 h : THandle;
begin
 h := CreateEvent(nil, true, false, '');
 WaitForSingleObject(h, amSecs);
 Closehandle(h);
end;      { Wait_mSec }


_Lucky_   (2004-12-12 18:27:00) [5]


> Здравствуйте!
> Подскажите, пожалуйста, какой аналог в  Делфи Паскалевсого
> Delay?
> Заранее благодарен за ответ.


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


Leonid Troyanovsky   (2004-12-12 18:17:00) [6]


> Leonid Troyanovsky ©   (12.12.04 18:10) [9]

> Чем это ProcessMeassages будет грузить систему?


Ай.
Конечно, в том случае д.б. HandleMessage.
Sorry.

--
С уважением, LVT.


Leonid Troyanovsky   (2004-12-12 18:10:00) [7]


> Суслик ©   (12.12.04 17:54) [8]

> Это я еще понять могу, но грузить так систему, да еще и
> в длительном периоде времени ... как-то это странно.


Чем это ProcessMeassages будет грузить систему?
Нет сообщений - нет загрузки.

Просто смысла в таких ожиданиях никакого.
Ждать надо чего-то - события, сообщения и т.п.
А для этого, IMHO, вполне хватит модального диалога для этого.

--
С уважением, LVT.


Суслик   (2004-12-12 17:54:00) [8]

или цикл из коретеньких sleep.

Это я еще понять могу, но грузить так систему, да еще и в длительном периоде времени ... как-то это странно.


DrPass   (2004-12-12 17:53:00) [9]

Во время sleep поток перестает реагировать на что-либо. Посколько при длительной задержке это обычно нежелательно, нужно использовать вместо одного sleep цикл, в котором была бы обработка сообщений


Суслик   (2004-12-12 17:47:00) [10]


> Решение [3] - годится и для длительных задержек

Пример (словами)?


Юрий Зотов   (2004-12-12 17:46:00) [11]

Для короткой задержки - Sleep (поток останавливается и в течение времени паузы не будет ни на что реагировать).

Решение [3] - годится и для длительных задержек, но в течение времени паузы сильно грузит CPU. Поэтому лучше использовать цикл с MsgWaitForMultipleObjects - тогда CPU нагружается именно настолько, насколько это реально требуется.


Суслик   (2004-12-12 16:18:00) [12]

выбрось в зад


_Lucky_   (2004-12-12 16:15:00) [13]

Аналог процедуры Delay в Delphi [взято из FAQ]


procedure TForm1.Delay(msecs : Longint);
var
  FirstTick : longint;
begin
    FirstTick:=GetTickCount;
    repeat    
      Application.ProcessMessages; {для того чтобы не "завесить" Windows}
    until GetTickCount-FirstTick >= msecs;
end;


Павел   (2004-12-12 16:10:00) [14]

Спасибо, Суслик!


Суслик   (2004-12-12 16:07:00) [15]

sleep(в 1/1000 сек)


Наверх

Титульная страница Поиск, карта сайта Написать письмо