Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.24;
Скачать: CL | DM;

Вниз

Задержка без использования TTimer   Найти похожие ветки 

 
VasRog   (2004-10-05 23:06) [0]

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


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

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


 
pipll ©   (2004-10-05 23:10) [2]

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


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

var t: longint;

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


 
Ihor Osov'yak ©   (2004-10-06 01:02) [4]

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;


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


 
Amoeba ©   (2004-10-06 11:38) [5]

Delay() из RxLib


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

Спасибо большое всем. Хорошо прошел
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;
вот этот вариант. Простой слип почему-то не захотел должным образом работать.


 
Mihey_temporary ©   (2004-10-06 23:37) [7]

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


 
Gero ©   (2004-10-06 23:41) [8]


> Mihey_temporary ©   (06.10.04 23:37)

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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2004.10.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.031 c
14-1097034845
Думкин
2004-10-06 07:54
2004.10.24
С днем рождения! 6 октября


1-1097562547
Артемий
2004-10-12 10:29
2004.10.24
Проблема с запуском Delphi 7(лицензия)


14-1096286314
Delpher
2004-09-27 15:58
2004.10.24
Изменение значений


4-1095587536
HDD
2004-09-19 13:52
2004.10.24
серийный номер


3-1096088312
KSergey
2004-09-25 08:58
2004.10.24
TDBGridEh, gstRectangle, удаление из списка выделенных