Форум: "Основная";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];
Вниз<<< Прервать задержку >>> Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.032 c