Главная страница
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.48 MB
Время: 0.021 c
1-1090987088
Last
2004-07-28 07:58
2004.08.08
Перевод символов в верхний регистр при вводе


3-1089614080
Смертник
2004-07-12 10:34
2004.08.08
Проблема с поиском в БД.


14-1090417137
Johnmen
2004-07-21 17:38
2004.08.08
Ночной позор


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


14-1090491340
DJ DIZzY
2004-07-22 14:15
2004.08.08
А как сделать кнопку выход???