Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.26;
Скачать: CL | DM;

Вниз

Задержка   Найти похожие ветки 

 
Павел   (2004-12-12 16:06) [0]

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


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

sleep(в 1/1000 сек)


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

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


 
_Lucky_   (2004-12-12 16:15) [3]

Аналог процедуры 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:18) [4]

выбрось в зад


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

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

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


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


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

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


 
DrPass ©   (2004-12-12 17:53) [7]

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


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

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

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


 
Leonid Troyanovsky ©   (2004-12-12 18:10) [9]


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

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


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

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

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


 
Leonid Troyanovsky ©   (2004-12-12 18:17) [10]


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

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


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

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


 
_Lucky_   (2004-12-12 18:27) [11]


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


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


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

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

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


 
jack128 ©   (2004-12-12 21:37) [13]

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


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

> Суслик ©   (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 и самостоятельное завершение цикла по таймауту при отстутствии сообщений.


 
GuAV ©   (2004-12-12 22:43) [15]

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


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

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


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



Страницы: 1 вся ветка

Текущий архив: 2004.12.26;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.028 c
14-1102473842
Думкин
2004-12-08 05:44
2004.12.26
С днем рождения! 8 декабря


14-1102489705
NewDelpher
2004-12-08 10:08
2004.12.26
Переводчик с C++ на Pas


1-1102806517
kurt
2004-12-12 02:08
2004.12.26
const : TFont


1-1102417746
COOLer
2004-12-07 14:09
2004.12.26
подсветка букв в RichEdit


14-1102528952
Alexander Panov
2004-12-08 21:02
2004.12.26
Настройка Apache.