Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.48 MB
Время: 0.034 c
3-1098786783
Артем К.
2004-10-26 14:33
2004.11.21
Какие компоненты использовать для работы с MySQL Server?


1-1099935857
White__
2004-11-08 20:44
2004.11.21
Шаблоны в Delphi7


1-1099457813
leonidus
2004-11-03 07:56
2004.11.21
Создание своей панели в IE


1-1099979166
nobse
2004-11-09 08:46
2004.11.21
Очищение StringGrid


14-1099575770
DelphiN!
2004-11-04 16:42
2004.11.21
Сокеты на винде тормозят





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский