Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Delay(200); - Что это такое, и что это значит


Автор: -Vadim- 23.8.2003, 01:18
Delay(200); - Что это такое, и что это значит.

Автор: Vit 23.8.2003, 01:41
Это значит остановиться, подождать 200 vcr и продолжить выполнение

Автор: December 23.8.2003, 02:12
Цитата(Vit @ 23.8.2003, 01:41)
vcr

Судя по клаве, имелось в виду 200 мкс. Не совсем так, Vit, 200 мс.

Автор: Vit 23.8.2003, 02:27
Сорри - просто очепятка - естественно миллисекунд

Автор: -Vadim- 23.8.2003, 02:46
Да? Как я понял это тоже самое что и Sleep(200) что ли. Кстате что то система у меня не останавливаеться при Delay(200). Он случаем не использует какой нибуть отдельный модуль.

Автор: Vit 23.8.2003, 04:08
Вообще-то стандартной функции Delay в Delphi нет, это в TP была...

Автор: MacTep 23.8.2003, 13:28
Да, ребят, с Delay действительно какой-то глюк. Система останавливается как-то странно. Может даже после того действия, перед которым стоит такая команда. А как работает Sleep? Это не одно и то же или все таки именно одно и тоже?

Автор: stab 23.8.2003, 13:38
MacTep в Delphi Delay нет, если ты на Delphi программишь значит ты либо Delay сам написал, либо он где-то в модуле, который в Delphi не входит. Постарайся найти исходный код и сюда выкладывай.

Автор: December 23.8.2003, 15:41
Sleep отдаёт процессорное время другим процессам. В принципе, sleep - самый корректный способ заснуть. Но! В это время не обрабатываются сообщения программой, что может привести к неприятным последствиям, особенно при работе с DDE.
Рекомендую вот такой вариант:
Код

procedure Wait (milliseconds:integer);
var
wint1:cardinal;
wint2:cardinal;
begin
wint1:=GetTickCount;
wint2:=wint1+milliseconds;
repeat
sleep(1);
application.ProcessMessages;
sleep(1);
until (wint2)<GetTickCount;
end;

Автор: &-ray 23.8.2003, 15:57
Вопрос вдогонку:
а зачем засыпать на 1 мс до и после application.ProcessMessages confused.gif

Автор: Vit 23.8.2003, 16:33
Цитата
Вопрос вдогонку:
а зачем засыпать на 1 мс до и после application.ProcessMessages confused.gif

Если у тебя есть какой-нибудь "показометр" загрузки процессора, попробуй его запустить и сравнить что он будет показывать если твоя программа крутит 2 разных цикла:

repeat
application.processmessages;
until False;

и

repeat
application.processmessages;
sleep(20);
until False;


Фокус в том, что application.processmessages - помогает прорисовке своего приложения, но реально сильно нагружает процессор, т.е. твоё приложение для выполнения application.processmessages забирает время от других процессов, а Sleep наоборот отдаёт время твоего приложения другим программам.

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

Например я в своей программе ждал пока отработает Adobe Distiller - так вот разница в скорости работы дистиллера если я ждал его со sleep в цикле и без sleep (только с application.processmessages) отличалась в несколько раз.

Иногда можно использовать Sleep(1) или даже Sleep(0) - это вот что означает - реально CPU выполняет только одну команду в одно время, т.е. многозадачность работает примерно так: Допустим у нас 10 процессов, тогда винда делит (упрощеёно) секунду на 10 неравных частей (в зависимости от приорететов приложений), и заставляет процессор обрабатывать сначала один процесс, затем переключает на обработку следующего процесса и так по кругу... допустим твоей проге выделена 1/5 секунды в каждой секунде, но твоя программа ни фига не делает, только кого-то ждёт, если у тебя стоит application.processmessages - то все это выделенное время расходуется на проверку и выполнение очереди сообщения, мало того так как это весьма напряжная процедура винда даже отнимает время у других процессов и отдаёт твоему. А что же происходит когда стоит

repeat
application.processmessages;
sleep(0);
until False;

Винда опять таки выделила твоей программе 1/5 секунды, но твоя программа быстро проверила сообщения, а дальше всё остальное время на этой секунде отдала другим приложениям, т.е. sleep(0) означает в текущем цикле прекратить выполнение твоего кода и отдать оставшееся время другому процессу. (PS. Естественно что винда оперирует квантами времени отнюдь не секундной длительности - это я для простоты примера привёл)

Автор: December 23.8.2003, 19:05
Цитата
Вопрос вдогонку:
а зачем засыпать на 1 мс до и после application.ProcessMessages confused.gif

Дело в том, что иногда требуется максимально равномерно распределить процессорное время и реакцию на события. До и после аппликатион.процессмессаги можно ставить разные задержки; в частности, до - 1, после - 0. Это было у меня наиболее эффективно.

Автор: &-ray 23.8.2003, 23:35
ОК, вроде дошло smile.gif
Я раньше не задумывался о таких тонкостях.

Автор: Akella 31.8.2003, 22:30
Да, а иногда одна мальенькая прималенькая мелочь решает почти все!

Автор: &-ray 31.8.2003, 23:32
Цитата
Да, а иногда одна мальенькая прималенькая мелочь решает почти все!

Тогда это уже не мелочь biggrin.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)