2010-09-20 4 views
1

Как вы можете сказать, я имею немного проблемы с компонентом TTimer VCL в моем приложение, разработанное с использованием Delphi 2010.Почему TTimer работает правильно?

Всякий раз, когда я называю:

компонент
Self.Timer1.Enabled := False; 
Self.Timer1.Enabled := True; 

Таймер, похоже, действительно привал, но он никогда не запускается снова. Например, он никогда не вызывает событие OnTimer.

Я использую его совместно с компонентом IRI Indy10 (TIdIRC).

Спасибо заранее :)

+4

Непонятно, что вы пытаетесь выполнить настройку Enabled на false, а затем true в последовательности. У меня нет проблем с использованием таймеров в Delphi. Пожалуйста, напишите более полный пример того, чего вы пытаетесь достичь. –

ответ

0

Я создал таймер в отдельном потоке и все работает хорошо снова :)

Спасибо, ребята, я узнал много вещей.

6

Вы также известно, что большинство Инди звонки блокируются? Таймер работает, отправляя сообщения Windows, что означает, что сообщения должны быть обработаны, чтобы таймер загорелся. Если приложение/основной поток блокирует его, он не обрабатывает сообщения, а таймеры не запускаются. Может, это твоя проблема?

Также, если ваше приложение является службой Windows или консольным приложением, сообщения могут не обрабатываться.

+0

В принципе, я делаю викторину. После каждых X миллисекунд (10000/10 секунд) он выдаст подсказку. Если пользователь правильно задает вопрос, он остановит таймер (указанным выше способом) и пойдет и выдает следующий вопрос. Надеюсь, что я имел смысл:/ – user452577

+0

Как это исправить, если это так? – user452577

+0

Используйте темы или не используйте Indy. Не используйте TTimer в службе Windows или консольном приложении. –

2

Извлеките Indy из уравнения и посмотрите, можете ли вы его получить, чтобы в основном вызывать подсказку каждые 10 секунд. Если нет, вы делаете что-то неправильно. Подобно неверному интерпретации интервала времени. Например, «(10000/10 секунд)» не очень понятно. Я думаю, вы имеете в виду «10000ms, что составляет 10 секунд», но вы не показываете свой код, поэтому я могу только догадываться. Delphi не будет догадываться, он будет делать то, что вы рассказываете. В любом случае, сделайте пример приложения с формой, кнопкой, полем редактирования и ttimer и экспериментом. Получите работу таймера, прежде чем вводить материал Indy. Тогда вы знаете, есть ли у вас проблема TTimer или проблема Indy.

+0

Хорошо, я забыл упомянуть, что таймер вызывает событие OnTimer каждые 10 секунд. Он работает, когда я не изменяю разрешенное состояние, но до тех пор, пока не сделаю это, он перестает вызывать событие OnTimer:/ – user452577

0

Вы должны убедиться, что вы вызываете эти методы TTimer только в контексте основной темы. Поскольку Indy использует потоки, вполне возможно, что это правило нарушено. Для того, чтобы выяснить, легко можно назвать Assert, когда код выполняется в контексте другого потока:

Assert(GetCurrentThreadId = MainThreadId); 
Self.Timer1.Enabled := False; 
Self.Timer1.Enabled := True; 

Я не знаю, что Self имеет в виду в своем коде, но это стоит попробовать.

+0

Self относится к классу формы. – user452577

+0

Я пробовал это. Он не вызывал никаких утверждений об ошибках. – user452577

Смежные вопросы