![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 31.07.2010
Сообщений: 52
|
![]()
Вот если я нахожусь внутри события OnTimer и заковырялся там, может ли случиться очередное событие OnTimer , пока я там нахожусь внутри. Или внутри при входе отключать таймер, а при выходе включать?
|
![]() |
![]() |
![]() |
#2 |
Участник клуба
Регистрация: 24.07.2009
Сообщений: 638
|
![]()
Да, нужно выключать.
** Удача терпелива. **
Vad3333@inbox.ru |
![]() |
![]() |
![]() |
#3 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]() Цитата:
А вообще чтоб окончательно избежать такой проблемы лучше использовать Thread а не таймер.
I'm learning to live...
|
|
![]() |
![]() |
![]() |
#4 |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
![]()
Ничего выключать не надо!!!
Таймер повторно не сработает. Объясняю: Таймер - событие и выполняется в потоке выборки сообщений. Пока поток занят выполнением таймерной процедуры, пока принудительно не вызываются ProcessMessages - процедура таймера параллельно предыдущей не запустится, поток то один. Да события/месаджи могут нападать в очередь, но они встанут в очередь и будут ждать пока поток не вернется к разгребанию очереди. Да процедура таймера может сработать раньше чем указано в интервале, а может и позже т.к. таймер имеет низкий событийный приоритет
Не стесняемся, плюсуем!
![]() |
![]() |
![]() |
![]() |
#5 |
Участник клуба
Регистрация: 24.07.2009
Сообщений: 638
|
![]()
Ну то есть вешаем на срабатывание таймера например
такую процедурку: Код:
![]() Не стоит изначально подкладывать себе мины.
** Удача терпелива. **
Vad3333@inbox.ru Последний раз редактировалось Vad33; 04.09.2014 в 08:55. |
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 17.03.2009
Сообщений: 977
|
![]()
и где пример что заковырялся в таймере? ваша процедура выполняется быстро, таймер не будет ждать получения ответа от кнопки, это не его задача. вот если бы вы поручили цикл до миллиона раз вычисления числа пи и ещё чего то что нагрузит проц то таймер вызовет тормоза программы. и второй раз пока не завершит не будет выполнятся. потому и рекомендуют использовать потоки что бы основная прога не висла во время обработки.
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.
|
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
Slym, Вы заблуждаетесь.
При чём здесь очередь сообщений Windows и процедура в Delphi ?! Неужели трудно написать простейший код и ПРОВЕРИТЬ то, что Вы утверждаете?! ![]() я сделал это за Вас. Экспериментируйте: EXE-шник: Project1EXE.rar Исходники: Project1Src.rar А по сути вопроса. Я лично в подобных случаях, когда возможно срабатывание следующего тика таймера до выхода из текущего, просто использую булевую переменную. вначале переменная isInTimer := false Зашли в процедуру таймера, проверили переменную, если она True - сразу вышли. иначе поставили isInTimer := true выполнили нужные действия. при выходе из таймера сделали isInTimer := false всё. повторные срабатывания нас больше не беспокоят. |
![]() |
![]() |
![]() |
#8 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]() Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 04.09.2014 в 09:33. |
|
![]() |
![]() |
![]() |
#9 | |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
![]() Цитата:
таймер это сообщение WM_TIMER Код:
3. Я четко указал что параллельно (а в нашем контексте одновременно) таймер не запустится, без вызова ProcessMessages или процедур вызывающих ее аналоги к коим относится MessageBox т.е. MessageBox можно представить в виде Код:
5. Мой пример. если таймер <1500мс то срабатывать об будет сразу, но не параллельно, как только закончится предыдущий, т.к. событие уже в очереди
Не стесняемся, плюсуем!
![]() Последний раз редактировалось Slym; 04.09.2014 в 10:21. |
|
![]() |
![]() |
![]() |
#10 | |||
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]() Цитата:
С тем, что я разрешаю оконному обработчику разобрать накопившуюся очередь сообщений, в том числе, среди прочих событий разрешаю вызвать процедуру таймера, - с этим я согласен. Да, это так. Цитата:
Цитата:
Код:
поставьте время работы процедуры побольше, просто для наглядности, ну, например, Код:
" таймер сработал в ...." а теперь попробуйте изменить время, или нажать на кнопку "Stop timer" или хотя бы, банально, форму по экрану подвигать. Не получается?! Вот именно! Это убедительно доказывает, что так, как Вы предлагаете (не использовать ProcessMessages) программировать нельзя! впрочем. Вы понимаете, о чём я пишу. Я понимаю, о чём Вы пишете. Думаю, что вопрос исчерапан, sapienti sat. |
|||
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Компонент TTimer | viks1 | Общие вопросы Delphi | 5 | 14.05.2012 19:56 |
TTimer | Китос | Общие вопросы Delphi | 5 | 24.09.2011 19:03 |
TTimer | ak3000 | Компоненты Delphi | 9 | 14.11.2008 18:18 |
TTimer в Delphi | AlexandrSid | Общие вопросы Delphi | 7 | 23.05.2008 14:10 |
TTimer | amandra | Компоненты Delphi | 3 | 19.11.2007 13:54 |