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

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

<<< Прервать задержку >>> [D6, Win2k]


VIo ©   (2004-11-09 11:47:00) 

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

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

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


panov   (2004-11-10 10:51:00) [1]

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


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


Anonimus   (2004-11-10 09:26:00) [2]

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


Anatoly Podgoretsky   (2004-11-09 17:27:00) [3]

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


panov   (2004-11-09 17:21:00) [4]

Anonimus ©   (09.11.04 16:42) [7]

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

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


Ihor Osov'yak   (2004-11-09 17:19:00) [5]

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

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


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


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


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


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

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


Fay   (2004-11-09 16:49:00) [8]

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


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

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


Ihor Osov'yak   (2004-11-09 16:46:00) [10]

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

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

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

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


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

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

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

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


Fay   (2004-11-09 15:11:00) [12]

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


Ihor Osov'yak   (2004-11-09 14:47:00) [13]

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

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

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

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

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

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);
- это один из вариантов "лекарства" от загрузки ЦП.


TUser   (2004-11-09 13:29:00) [14]


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

Это не так


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

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

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


Symb   (2004-11-09 11:54:00) [16]

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


TUser   (2004-11-09 11:53:00) [17]

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

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


Наверх

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