Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1102489705
NewDelpher
2004-12-08 10:08
2004.12.26
Переводчик с C++ на Pas


14-1102340478
msguns
2004-12-06 16:41
2004.12.26
Кто похвалит себя лучше всех


3-1101797288
_Sheriff
2004-11-30 09:48
2004.12.26
рекурсивная процедура в Firebird


6-1097472068
Slonco
2004-10-11 09:21
2004.12.26
В отправленном письме абракадабра...


14-1101808213
Sur
2004-11-30 12:50
2004.12.26
PL/1 - Programming Language One





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский