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

Вниз

Немного о TTimer е   Найти похожие ветки 

 
ИМХО ©   (2004-07-24 12:39) [0]

Вот объясните мне такую вещь, пожалуйста. Имеем TTimer с интервалом в 100 миллисекунд. Время выполнения процедуры обработки события OnTimer > 100 миллисекунд. Что произойдет?


 
Anatoly Podgoretsky ©   (2004-07-24 12:43) [1]

В зависимости от процедуры, может быть очень плохо, например StrackOverflow/Out of Memory


 
oleg_SYS ©   (2004-07-24 12:47) [2]

Ну типа через каждые 100 миллисекунд будет обрабатываться событе onTimer, которое длится 100 миллисекунд, как ты сказал :) Итого 200 миллискунд + НДС + 5% на пенсионный фонд Российской федерации :)


 
Rem   (2004-07-24 13:00) [3]

Диспетчер событий Windows перед помещением событий определенного типа (мышь, таймер) в очередь, проверяет очередь на наличие сообщений того же происхождения, и, если таковые найдутся, не добавляет новое сообщение.
Поэтому, на самом деле, ничего не произойдет.
Например:
 Таймер имеет интервал 10 мсек.
 Метод обработки события выполняется 100 мсек.
 По прошествии 1 сек таймер останавливается.
 Итого, будем иметь 10 выполнений метода обработки события.
 То-есть, в очереди не накопится 100 сообщений от таймера.


 
Rem   (2004-07-24 13:10) [4]

Сам попробуй:

Кинь на форму:
Таймер с интервалом 100 мсек
Лйэбл с текстом "1"
Кнопку

OnButton1Click:
 Timer1.Enabled := not Timer1.Enabled;

OnTimer:
 Sleep(200);
 Label1.Caption := IntToStr(StrToInt(Label1.Caption) + 1);

Подождать с минуту (можно до 100 :) - и нажать на кнопку.
О результатах проведенного эксперимента предоставить полный отчет в письменном виде :)


 
Anatoly Podgoretsky ©   (2004-07-24 13:24) [5]

Слишком у тебя просто пример


 
Rem   (2004-07-24 13:43) [6]

Казнить нельзя помиловать.

Побольше конкретики, пожалуйста...


 
Piter ©   (2004-07-25 01:04) [7]

честно говоря, не знаю как устроен таймер.

Но что мешает разобраться, если интересно? Хотя бы можно поставить эксперимент - кинуть на форму таймер с интервалом в секунду.. Поставить там всего одну комманду, beep; например. И поставить на нем брекпоинт, запустить приложение, по брекпоинту приложение остановится, а ты сидишь и ждешь. Потом жмешь F9 и наблюдаешь мгновенное вхождение в обработчик еще раз. Отсюда однозначный вывод, что события становятся в очередь.
Можно и посложнее пример придумать:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 beep;
 sleep(2000);
 beep;
end;


Можно убедиться, что пока не произойдет полная обработчка одного события, второй раз оно не вызывается. Эксперименты заняли у меня около минуты.
А теперь ответим на поставленный вопрос:

ИМХО ©   (24.07.04 12:39)
Имеем TTimer с интервалом в 100 миллисекунд. Время выполнения процедуры обработки события OnTimer > 100 миллисекунд. Что произойдет?


после первого вызова обработчика последующие будут происходить сразу после окончания работы предыдущего обработчика, вот и все. Они как бы накапливаются.

Можно задаться еще вопросами аля "а что будет если остановить таймер - будут ли выполнены все события в очереди?". Но мне уже неинтересно проверять и так целую минуту потратил.
А вообще интересно - самому что ли сложно? Дельфи под рукой нету, да? :) (стандартная отмазка)



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

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

Наверх




Память: 0.49 MB
Время: 0.051 c
3-1089710228
Джон
2004-07-13 13:17
2004.08.08
INSERT записи из текстового файла


1-1090577738
кларк
2004-07-23 14:15
2004.08.08
Как сделать, чтобы ListBox заполнился при откр диал окна?


3-1089947669
ksa2002
2004-07-16 07:14
2004.08.08
DBGrid


14-1090028059
Думкин
2004-07-17 05:34
2004.08.08
С днем рождения! 17 июля


14-1090583927
Sun bittern
2004-07-23 15:58
2004.08.08
Ошибка соеденения HTTP 403