TTimer не стреляет

78
9

У меня странная проблема. У меня есть TTimer в моей основной форме, которая должна срабатывать 500 мс. после создания формы.


Он отлично работает, когда я запускаю его из IDE, но когда я запускаю его на другом ПК W7, создается основная форма, но таймер не срабатывает. (Некоторые компоненты не обновляются). Если я нажму элемент управления, все будет обновлено, и таймер загорится, и все будет в порядке. Если я перемещаю форму, все обновляется, но таймеры не запускаются. Если я запустил его на ПК с установленной Delphi, он отлично работает. Нет проблем.


Код в MyForm.OnCreate выполняется отлично. Timer.Enabled := True ничего не меняет.


Любая идея, что вызывает это? Я действительно застрял здесь.


С уважением.

спросил(а) 2012-08-14T20:53:00+04:00 7 лет, 10 месяцев назад
1
Решение
95

Существует множество возможностей:


    Сообщения WM_TIMER передаются только в том случае, когда очередь сообщений пуста. Если что-то в вашем приложении или что-то в другом приложении, запущенном на этих других компьютерах, достаточно часто отправляло сообщения в дескриптор окна, чтобы очередь сообщений для этого окна никогда не опустошалась, события WM_TIMER никогда не срабатывали. Если это произошло, вам, возможно, придется ждать 10x или 20x или 30x в обычном TTimer периоде, но в конечном итоге событие, вероятно, будет срабатывать. Я до сих пор не заметил, что таймер вообще не срабатывает, но это, конечно, теоретически возможно...


    Хотя вы говорите, что знаете точно, что таймер включен (вы его включили), возможно, что где-то ELSE в коде вы его отключили.


    Если вы делали некоторые попытки... except..end блоки и игнорировали исключение, тогда могло произойти что-то плохое, что вы не видите на этих других машинах.


    Ваш код таймера может быть запущен, но исключение, сбой или зависание могут происходить в коде, который выполняется на таймере.


    У вас может быть в вашем коде ряд обработчиков событий Delphi, которые создают почти "бесконечную петлю", потому что некоторые обработчики событий, которые вы написали, стреляют, когда вы этого не хотите, вызывая эффекты, которые поддерживают ваше приложение. Вы упоминаете, что вы нажимаете где-то, и проблема исчезает. Этот клик может быть достаточным для прерывания какого-либо другого порочного цикла в вашем коде.


    Вы упомянули, что он работает на любом ПК с установленным на нем delphi. Используете ли вы сторонний элемент управления, который имеет некоторые ограничения в нем (например, требуется, чтобы вы запускали внутри отладчика?). Или ваше приложение загружает некоторые DLL или BPL, которые не установлены на этих других компьютерах?


Начните с совершенно нового приложения, в котором нет ничего. Добавьте TTimer. Теперь в событии таймера приращиваем целочисленное значение поля и записываем это значение в заголовок формы. Теперь запустите его на других машинах. Он будет работать нормально.

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


Попробуйте добавить некоторые сообщения о регистрации, используя OutputDebugString и запустив DebugView на других машинах, если вы хотите увидеть некоторые внутренние элементы вашего приложения на этой другой машине

ответил(а) 2012-08-16T03:23:00+04:00 7 лет, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема