![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 | ||
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
![]() Цитата:
Код:
Цитата:
![]() Код:
Не стесняемся, плюсуем!
![]() Последний раз редактировалось Slym; 04.09.2014 в 12:27. |
||
![]() |
![]() |
![]() |
#12 |
Пользователь
Регистрация: 31.07.2010
Сообщений: 52
|
![]()
Ну, в общем, всё понятно, лучше "перебздеть, чем недобздеть" - и каждый вход в событие OnTimer либо синхронизировать внешней булевой переменной, либо в самом событии выключать\включать таймер при входе\выходе из события.
Всем спасибо! ![]() |
![]() |
![]() |
![]() |
#13 | |||||
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]() Цитата:
Прямой (или простой) рекурсии - тут, разумеется, нет. цитирую с википедии: Цитата:
Код:
поэтому, когда Вы вызываете какую-то функцию, например, Application.Restore Вы можете знать, есть там обработка очереди сообщений? Это рекурсивный вызов? Это раз. Второе. Вы меня не переубедите. Нормальная программа должна отдавать тики операционной системе. Это и выполняется (в явную) через ProcessMessage. При чём здесь консольное приложение Цитата:
Вы хотите показать, что окно всё равно обрабатывается? Ну так правильно. В консоли можно же запустить программу, которая не имеет оконного обработчика и, соотвественно, не отдаёт тики системе. А Вы написали много консольных программ, использующих TTimer? Или это просто так пример, для поддержания разговора? ![]() А не хотите подобный код вставить в обработчик событий формы или на таймер. Тоже всё будет так же хорошо? ![]() Цитата:
В том, где я показываю, что процедуру таймера НЕЛЬЗЯ оставлять без защиты от повторного вызова и там же, где в коде написано: Цитата:
Slym, скажите, а в чём Вы меня пытаетесь убедить? В том, что TTimer не нужно использовать? Или в том, что внутри TTimer нельзя писать длинные циклы? Или в том, что в длинных циклах нельзя использовать фунции, позволяющие обработать очередь оконных сообщений? xexxex, правильно, дьявол кроется именно в деталях. Нужно смотреть конкретный код, конкретную процедуру. И, как правильно сказано в теме, не стоит вешать на таймер очень длинные процедуры, или процедуры, которые заведомо не имеют фиксированной длительности, например, ожидание ввода данных пользователем в InputBox... |
|||||
![]() |
![]() |
![]() |
#14 |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
![]()
в вашем примере если таймер будет выполнятся дольше, периода сработки т.е. более 1500мс (а в непредсказуемой многозадачности это влегкую): EStackOverflow - вопрос времени, и пихать такой код в таймер в приложении 24/365 я бы не стал.
А убедить пытаюсь не вас, а топикстартера, чтоб не копипастил ваши примеры
Не стесняемся, плюсуем!
![]() |
![]() |
![]() |
![]() |
#15 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]() Цитата:
На мой взгляд, процедура, висящая на таймере, если есть малейшее подозрение, что время работы этой процедуры может быть БОЛЬШЕ, чем интервал таймера, может выглядеть следующим образом: Код:
Хотя, конечно, на проблемы с тем, что таймер может пропускать события, это никак не влияет... Последний раз редактировалось Serge_Bliznykov; 05.09.2014 в 08:47. |
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Компонент 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 |