Форум: "Основная";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
ВнизЗадержка Найти похожие ветки
← →
Павел (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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.035 c