Почему TTimer не работает правильно? - PullRequest
1 голос
/ 20 сентября 2010

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

При каждом вызове:

Self.Timer1.Enabled := False;
Self.Timer1.Enabled := True;

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

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

Заранее спасибо:)

Ответы [ 4 ]

6 голосов
/ 20 сентября 2010

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

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

2 голосов
/ 20 сентября 2010

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

1 голос
/ 20 сентября 2010

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

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

Я не знаю, на что ссылается Self в вашем коде, но стоит попробовать.

0 голосов
/ 29 сентября 2010

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

Спасибо, ребята, я многому научился.

...