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

Вниз

<<< Прервать задержку >>>   Найти похожие ветки 

 
VIo   (2004-11-09 11:47) [0]

Всем привет, читая FAQ я нашёл, что след процедура будет лучше чем использование таймера(сам убедился)

procedure Delay(ms : longint);
var
TheTime : LongInt;
begin
TheTime := GetTickCount + ms;
while GetTickCount < TheTime do
Application.ProcessMessages;
end;

Но как можно прервать выполнение этой процедуры ???


 
TUser ©   (2004-11-09 11:53) [1]

А почуму бы не sleep?

Чтобы прервать - выноси ее в отд. поток и проверяй. Но честно говоря, я не понимаю почему она лучше таймера - если тебе потребуется "прервать" таймер - просто поставишь ему enabled:=false и все.


 
Symb   (2004-11-09 11:54) [2]

У тебя же ProcessMessages написано, т. е. обрабатываются все события, в том числе нажатие клавиш и пр. пользовательские действия.
Сделай TheTime глобальной и присвой ей значение, достаточное для выхода из цикла, например, если пользователь нажал Button1.


 
VIo   (2004-11-09 12:00) [3]

<< я не понимаю почему она лучше таймера

ПРосто мне нужно больше времени чем 1 минута(у таймера максимально 1 минута) -- это один из вариантов решения проблемы.


 
TUser ©   (2004-11-09 13:29) [4]


> у таймера максимально 1 минута

Это не так


 
Ihor Osov'yak ©   (2004-11-09 14:47) [5]

> что след процедура будет лучше чем использование таймера

я бы так не сказал... Для начала взгяните на загрузку ЦП, во время работы этой функции..

> Но как можно прервать выполнение этой процедуры ???

выставив какой-то флажок и анализируя его в цыкле.

Примерно так:

var
flBreak: boolean;

procedure Delay(ms : longint);
var
  TheTime : LongInt;
begin
 TheTime := GetTickCount + ms;
 flBreak := false;
 while GetTickCount < TheTime do
 begin
  if  flBreak then Break;
  if GetQueueStatus(QS_ALLEVENTS) <> 0 then
    Application.ProcessMessages
  else
    sleep(10);  
 end;
end;

procedure TForm1.btBreakClick(Sender: TObject);
begin
 flBreak := true;
end;


зы -
   if GetQueueStatus(QS_ALLEVENTS) <> 0 then
    Application.ProcessMessages
  else
    sleep(10);
- это один из вариантов "лекарства" от загрузки ЦП.


 
Fay ©   (2004-11-09 15:11) [6]

2 VIo
Есть вероятность того, что юзер помрёт от голода и жажды, пока дождётся выполнения этой процедуры


 
Anonimus ©   (2004-11-09 16:42) [7]

А почему не так

procedure Form1.OnTimer1(sender: TObject);
begin
 inc(Counter);
 if Counter={kakoeto pznachenie} then begin
   counter:=0;
   {vyzov kakoyto procedury}
 end;
end;

по-моему логичнее
Counter- цельная переменая объявленная в классе форм1


 
Ihor Osov'yak ©   (2004-11-09 16:46) [8]

2 [6] Fay ©   (09.11.04 15:11)

хм.. Намек на 49.7 дней без перезагрузки? Или есть иные соображения?

2 [7] Anonimus ©   (09.11.04 16:42)

может и логичнее. Но это уже вопрос к автору топика. Это же он "нашёл" :-)


 
Fay ©   (2004-11-09 16:46) [9]

Нифига не логичнее. По-моему.


 
Fay ©   (2004-11-09 16:49) [10]

2 Ihor Osov"yak ©   (09.11.04 16:46) [8]
>> хм.. Намек на 49.7 дней без перезагрузки?
Ага. Вероятность маленькая, но она есть.


 
Anonimus ©   (2004-11-09 17:07) [11]

Удалено модератором


 
KilkennyCat ©   (2004-11-09 17:12) [12]


> Anonimus ©   (09.11.04 17:07) [11]


как я понял, имелась ввиду ошибка виндоуза.


 
Ihor Osov'yak ©   (2004-11-09 17:19) [13]

2 [10] Fay ©   (09.11.04 16:49)

ну да, в проектах, имеющих замашки на надежность, следует учитывать.
Но с другой стороны, в тех же проектах следует избегать кода в стиле [0], [5].. Хотя, если честно, иногда шедаврами в стиле [5] грешу, но, только для пауз до секунды или двух, а во вторых - условие  цыкла пишется в виде  abs(GetTickCount - StartTime) < ms и StartTime := GetTickCount перед цыклом. Конечно, если нулевая задержка вместо ожидаемой на момент пресловутого 49.7 не чревата неприятностями..


 
panov ©   (2004-11-09 17:21) [14]

Anonimus ©   (09.11.04 16:42) [7]

Читай у автора вопроса в оригинале - "<<< Прервать задержку >>>".

Т.е. у автора именно в этом месте нужна блокировка дальнейшего выполнения программы, а не обработка событий таймера.


 
Anatoly Podgoretsky ©   (2004-11-09 17:27) [15]

VIo   (09.11.04 11:47)  
То что у тебя описано, это не задержка, а ожидание события с тайм аутом.
while (GetTickCount < TheTime) and условие do ...


 
Anonimus ©   (2004-11-10 09:26) [16]

>panov ©   (09.11.04 17:21) [14]
читайте Anatoly Podgoretsky ©   (09.11.04 17:27) [15]
А так же http://www.delphimaster.ru/vopros/index.html
И у меня скромная просьба: не удаляйте ответы "по существу", там не было ничего запрещенного. Только мое IMHO
Будьте людьми :)


 
panov ©   (2004-11-10 10:51) [17]

>Anonimus ©   (10.11.04 9:26) [16]
И у меня скромная просьба: не удаляйте ответы "по существу", там не было ничего запрещенного. Только мое IMHO
Будьте людьми :)


У меня тоже скромная просьба - соблюдать правила.
Не надо сюда выкладывать мат.



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

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

Наверх




Память: 0.51 MB
Время: 0.029 c
14-1099881443
Думкин
2004-11-08 05:37
2004.11.21
С днем рождения! 8 ноября


1-1099990169
race1
2004-11-09 11:49
2004.11.21
caption


14-1099652798
}|{yk
2004-11-05 14:06
2004.11.21
Курт Воннегут: Конец близок ("In These Times", США)


1-1099910092
slaga
2004-11-08 13:34
2004.11.21
Замена Glyph на батоне


14-1099563212
Deniz
2004-11-04 13:13
2004.11.21
Delphi7 &amp; Delphi8