![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
<<< Прервать задержку >>> [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 и все.