Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задержка... какая есть альтернатива sleep()? 
:(
    Опции темы
Z_P
  Дата 17.10.2003, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 4.10.2003
Где: это я?

Репутация: нет
Всего: нет



Здоров Винградовцы!
кто подскажет, какая есть альтернатива sleep(ms)?
Потому что наверно сами знаете как использовать sleep()
Хочу сделать типа того:

begin

действие
...
подождать определенное время
...
следующее действие

...
end;

кто подскажет? таймер, не предлогать через него долго реализовывать... hmmm.gif
PM MAIL   Вверх
Pakshin A. S.
Дата 17.10.2003, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Накопал самое короткое:
Код

reepat
while PeekMessage(Msg, 0, 0, 0, pm_Remove) do
 begin
  TranslateMessage(msg);
  DispatchMessage(msg);        
 end;
until (*Условие выхода*);

PM   Вверх
December
Дата 17.10.2003, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



Z_P Я совсем недавно писал про хорошую процедуру задержки, она включает в себя sleep, но и кое-что ещё.


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
December
Дата 17.10.2003, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57





--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Z_P
Дата 17.10.2003, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 4.10.2003
Где: это я?

Репутация: нет
Всего: нет



Pakshin A. S. & December
большое спасибо!!!! буду пробывать ваши варианты!
PM MAIL   Вверх
Monty
Дата 17.10.2003, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Advanced Lamer
****


Профиль
Группа: Участник Клуба
Сообщений: 3511
Регистрация: 3.4.2003
Где: Гваделупа

Репутация: нет
Всего: 27



December твой код:
Код
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;

Если я задам одну милисекунду, то получится не одна, а две т.к. там стоят два Слепа по одной милисекунде и получается минимум 2 милисекунды он может ждать ........... или только четное число smile.gif

А если так?
Код
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;

Вроде бы все хорошо smile.gif


--------------------
...
О, вещая моя печаль,
О, тихая моя свобода
И неживого небосвода
Всегда смеющийся хрусталь!
PM MAIL ICQ   Вверх
<Spawn>
Дата 18.10.2003, 06:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Monty А зачем вообще здесь использовать Sleep? Я сомневаюсь что цикл будет так нагружать систему, что придется отдавать кванты времени другим процессам.

Это сообщение отредактировал(а) <Spawn> - 18.10.2003, 06:34


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Dmitry V.Abramov
Дата 18.10.2003, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 30.9.2003
Где: Saint-Petersburg

Репутация: 5
Всего: 4



Monty Лучше оставить оба sleep. Рассуждения Vit об их значимости есть в той же ветке откуда взят пример. Но я бы их оба сделал sleep(0).

С другой стороны - ведь если ты зашел в Wait, то ты зашел подождать ведь? smile.gif А подождать меньше чем 10 миллисекунд все-равно врядли получится из-за вызова Application.ProcessMessages;. Здесь слово Wait правильнее было бы трактовать так - подождать не меньше чем столько-то.

<Spawn> Лучше отдать. Ведь все-равно ждем. А так - фоновые процессы будут работать "ровнее". Ведь автор писал этот код не теоретически (как мы сейчас обсуждаем smile.gif ), а экспериментально.
--------------------
/DVA
PM MAIL WWW   Вверх
Z_P
Дата 19.10.2003, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 4.10.2003
Где: это я?

Репутация: нет
Всего: нет



Спасибо всем!
У меня получилось, и на первый взгляд вроде и не глючит.
И как у просто sleep(), не подтормаживает всю форму!
Мне собственно важно было не то чтобы освобождал системные ресурсы, даные программе а чтобы просто подождал немного...
Monty Использую твой подредактированный вариант.
PM MAIL   Вверх
Monty
Дата 19.10.2003, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Advanced Lamer
****


Профиль
Группа: Участник Клуба
Сообщений: 3511
Регистрация: 3.4.2003
Где: Гваделупа

Репутация: нет
Всего: 27



Dmitry V.Abramov думаю для более точного вайта лучше то что я привел wink.gif ..... т.к. при Wait(1000) проходит 100 циклов ....... вот почему так? smile.gif ....... у меня, например, максимальная точность до 10 мсек, но точно smile.gif ..... т.е. Wait(2010) ждет именно столько +/- 10 ;) ....... если поставить два Sleep(0), то будет загрузка процессора, а так Sleep(1) нет smile.gif


--------------------
...
О, вещая моя печаль,
О, тихая моя свобода
И неживого небосвода
Всегда смеющийся хрусталь!
PM MAIL ICQ   Вверх
Dmitry V.Abramov
Дата 19.10.2003, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 30.9.2003
Где: Saint-Petersburg

Репутация: 5
Всего: 4



Monty 10ms - магическое число для ProcessMessages. Если очередь пуста, то будет чуть меньше, если нет то >= 10ms.

А вот разлица между sleep(0) и sleep(1) - очень странная. Даже не знаю что предположить... Пришлось спросить папу Борланда - что он думает о sleep в Delay? Папа ответил, что о sleep вообще не думает:
Код
procedure Delay(ms : longint);
var TheTime : LongInt;
begin
 TheTime := GetTickCount + ms;
 while GetTickCount < TheTime do Application.ProcessMessages;
end;

Прям хоть садись и самостоятельно все проверяй...

Кстати, давайте обозначим, под какими ОС плохо ведет себя delay(0)? Мои советы основывались на очень давних экспериментах под win98se.
--------------------
/DVA
PM MAIL WWW   Вверх
Monty
  Дата 19.10.2003, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Advanced Lamer
****


Профиль
Группа: Участник Клуба
Сообщений: 3511
Регистрация: 3.4.2003
Где: Гваделупа

Репутация: нет
Всего: 27



Я не понимаю кто кого не понял, но я уж точно smile.gif

Я имел ввиду что если так
Код
procedure Wait (milliseconds:integer);
var
wint1:cardinal;
wint2:cardinal;
begin
wint1:=GetTickCount;
wint2:=wint1+milliseconds;
repeat
application.ProcessMessages;
sleep(1);
until (wint2)<GetTickCount;
end;

то все отлично и точно smile.gif .... точнее чем с двумя sleep ....... а про sleep(0) я имеел ввиду так
Код
procedure Wait (milliseconds:integer);
var
wint1:cardinal;
wint2:cardinal;
begin
wint1:=GetTickCount;
wint2:=wint1+milliseconds;
repeat
sleep(0);
application.ProcessMessages;
sleep(0);
until (wint2)<GetTickCount;
end;

Загрузка процессора 100% wink.gif
-------------
А Delay ни разу в жизни не использовал ...... шас нет времени на эксперементы smile.gif


--------------------
...
О, вещая моя печаль,
О, тихая моя свобода
И неживого небосвода
Всегда смеющийся хрусталь!
PM MAIL ICQ   Вверх
Dmitry V.Abramov
Дата 19.10.2003, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 30.9.2003
Где: Saint-Petersburg

Репутация: 5
Всего: 4



Monty Все всех поняли, раз все работает. Вот только я перестал понимать принцип работы sleep(0). По теории он должен вести себя лучше чем sleep(1)... Пример, приведенный мною, взят из FAQ сайта borland.com. Это один-в-один используемый тобой алгоритм, за исключением применения sleep вообще.

Кстати, а попробуй убрать у себя и оставшийся sleep(1). Как изменится работа Delay и загрузка CPU ?
--------------------
/DVA
PM MAIL WWW   Вверх
December
Дата 20.10.2003, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



Цитата
давних экспериментах под win98se.

2000 ведёт себя так же.


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Monty
Дата 20.10.2003, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Advanced Lamer
****


Профиль
Группа: Участник Клуба
Сообщений: 3511
Регистрация: 3.4.2003
Где: Гваделупа

Репутация: нет
Всего: 27



Мой Delphi7 вообще не знает что такое Delay

Если убрать вообще Sleep, то загрузка остается таже ......
У меня ХР с включенными темами wink.gif

Это сообщение отредактировал(а) Monty - 20.10.2003, 22:00


--------------------
...
О, вещая моя печаль,
О, тихая моя свобода
И неживого небосвода
Всегда смеющийся хрусталь!
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0543 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.