Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Задержка без использования TTimer [D7, WinXP]


VasRog ©   (2004-10-05 23:06:00) 

Подскажите, пожалуйста, как можно организовать простой программы на некоторое время без использования TTimer. Помнится в паскале была функция DELAY(), которая этим занималась, но я так понимаю в дДельфи ее убрали.


Erik1   (2004-10-07 17:38:00) [1]

Присотановить, значить ничего не вычислять? Это просто, надо выйти из всех циклов с помощю exit. Если надо заморозить GUI то поробуй смертельный номер, сделай Susped главному потоку!


VasRog   (2004-10-07 17:18:00) [2]

Удалено модератором
Примечание: Вопросы по разным темам - в разных ветках.


Gero   (2004-10-06 23:41:00) [3]


> Mihey_temporary ©   (06.10.04 23:37)

Во, самый лучший вариант )


Mihey_temporary   (2004-10-06 23:37:00) [4]

var i, k: Integer;
   n: Integer;
...
Randomize;
for i := 1 to 100000000 do
for k := 1 to 100000000 do
 n := Random(300000);


VasRog   (2004-10-06 23:33:00) [5]

Спасибо большое всем. Хорошо прошел
var t: longint;

begin
..
t:=GetTickCount;
while GetTickCount<t+1000 do  //1000 - время в миллисекундах
begin
 if GetQueueStatus(QS_ALLEVENTS) <> 0
 then
     Application.ProcessMessages
 else
   sleep(10);
end
..
end;
вот этот вариант. Простой слип почему-то не захотел должным образом работать.


Amoeba   (2004-10-06 11:38:00) [6]

Delay() из RxLib


Ihor Osov'yak   (2004-10-06 01:02:00) [7]

2 [1] BDenis ©   (05.10.04 23:09)

> Sleep (1000) - 1 секунда сна :)

Это остонов потока. Куда еще ни шло в рабочих потоках, и то не всегда, в основном потоке гуишного приложенеия - ну очень мерзко смотрится...

2 [3] tormoz   (05.10.04 23:29)

> t:=GetTickCount;
> while GetTickCount<t+1000 do; //1000 - время в миллисекундах

и получим почти 100 процентную загрузку системы.. С одновременной
заморозкой того же гуи, если в основном потоке..  

Если все же на первом месте простота - то можно посоветовать некоторую модификацию этого способа -

var t: longint;

begin
..
t:=GetTickCount;
while GetTickCount<t+1000 do  //1000 - время в миллисекундах
begin
  if GetQueueStatus(QS_ALLEVENTS) <> 0
  then
      Application.ProcessMessages
  else
    sleep(10);
end
..
end;


недостаток этого  способа = недостаткам использования Application.ProcessMessages, в первую очередь - опасность нарваться на повторный вызов процедуры до окончания ее работы в случае бардачного кодирования..

....

если делать по человечески, то либо использовать апишные таймера -
см.  SetTimer, KillTimer.

Либо перейти к обьектам синхронизации (с изменениям архитектуры приложения).
Кстати, для всяких WaitFor... можна также указывать время таймаута..

Если WaitFor... нужно использовать в основном потоке - то можно вспомнить про факт наличия MsgWaitForMultipleObjects - снова же с целью избежания "заморозки" основного потока..  примерно так -

   
 while True do
   begin
     result := MsgWaitForMultipleObjects(1, hHandle, false, dwMilliseconds,
       QS_AllINPUT);
     case result of
       WAIT_TIMEOUT,
         WAIT_ABANDONED,
         Wait_Object_0: Break;
       Wait_Object_0 + 1:
           if Peekmessage(Msg, 0, 0, 0, PM_REMOVE) then
         begin
           TranslateMessage(Msg);
           DispatchMessage(Msg);
         end;
     end;
   end;


в принцыпе - опасность повторного вхождения здесь также сохраняется (при бардачке, естественно)...


tormoz   (2004-10-05 23:29:00) [8]

var t: longint;

begin
..
t:=GetTickCount;
while GetTickCount<t+1000 do; //1000 - время в миллисекундах
..
end;


pipll   (2004-10-05 23:10:00) [9]

> VasRog
А чем TTimer не по нраву?


BDenis   (2004-10-05 23:09:00) [10]

Sleep (1000)- 1 секунда сна :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо