![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Задержка [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 сек)