Таймер C# не отсчитает

у меня есть странная проблема... Я шел не в своем уме для нескольких прошлых часов... таймер, я вставил свой код winform (от панели инструментов), не отсчитает...

У меня есть таймеры на нескольких формах в моей программе, они все хорошо работают... Я пытаюсь сделать точно то же это это, это не отсчитает... Я выбираю его, перетаскиваю его на форме, включаю его, устанавливаю интервал и обрабатываю событие галочки..., и ничего не происходит..., я даже пытался поместить случайный код как messagebox.show в событии галочки только, чтобы видеть, происходит ли что-нибудь, и ничто!!! как я сказал, еще нескольких таймеров в моей программе (на других формах, не в той, которая я пытаюсь поместить этот таймер), и они все хорошо работают...

какие-либо предложения?

заранее спасибо!

10
задан Henk Holterman 19 March 2010 в 09:28
поделиться

4 ответа

Убедитесь, что вы запустили его, вызвав timer1.Start ()

6
ответ дан 3 December 2019 в 15:51
поделиться

разве таймер System.Windows.Forms.Timer не запускается на .enabled... в любом случае... я только что заставил его работать... я скопировал сгенерированный visual studio код из WINFORMNAME.designer.cs в WINFORMNAME.cs... я не знаю, как и почему, но это сработало...

System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
timer.Enabled = true;
timer.Interval = 1000; 
timer.Tick += new EventHandler(timer_Tick); 
        void timer_Tick(object sender, EventArgs e)
        {
//do something
        }

спасибо всем за ответы!

7
ответ дан 3 December 2019 в 15:51
поделиться

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

Я не знаю, каков "правильный" ответ, но это сработало для меня довольно хорошо:

public class BetterTimer : System.Windows.Forms.Timer
{
    public BetterTimer():base()        
    { base.Enabled = true; }

    public BetterTimer(System.ComponentModel.IContainer container) : base(container) 
    { base.Enabled = true; }

    private bool _Enabled;
    public override bool Enabled
    {
        get { return _Enabled; }
        set { _Enabled = value; }
    }

    protected override void OnTick(System.EventArgs e)
    { if (this.Enabled) base.OnTick(e); }
}

Три вещи в этом подходе:

1) Переопределяя конструкторы, я гарантирую, что базовый таймер включен с самого начала.

2) Переопределяя "Enabled", я никогда не позволяю базовому таймеру стать отключенным, но интерфейс не меняется.

3) Переопределяя "OnTick", я позволяю переопределенному свойству Enabled решать, должно ли событие сработать или нет.

Start() и Stop() работают, устанавливая true и false для свойства Enabled, соответственно.

BTW - кто-нибудь знает, почему событие никогда не срабатывает (или отключается?), когда таймер останавливается/отключается не из потока пользовательского интерфейса?

.
10
ответ дан 3 December 2019 в 15:51
поделиться

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

3
ответ дан 3 December 2019 в 15:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: