Главная страница
    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.49 MB
Время: 0.365 c
1-1103043697
Sam Stone
2004-12-14 20:01
2004.12.26
Объект в объекте


6-1097653841
Maxwell
2004-10-13 11:50
2004.12.26
Узнать IP клиентов, подключаемых к idTCPServer


14-1102492845
Суслик
2004-12-08 11:00
2004.12.26
Delphi 2005 и никаких клиент-серверов


14-1102174987
Ламеррр
2004-12-04 18:43
2004.12.26
Глюк среды Delphi 7 или ОС или я напартачил?...


3-1101694710
Пыч
2004-11-29 05:18
2004.12.26
TDBGridEh





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский