Таймер C # не будет работать - PullRequest
10 голосов
/ 19 марта 2010

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

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

есть предложения?

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

Ответы [ 6 ]

10 голосов
/ 14 мая 2010

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

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

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) Переопределив «Включено», я никогда не позволяю отключить базовый таймер, но интерфейс не меняется.

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

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

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

7 голосов
/ 19 марта 2010

не запускается таймер 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
        }

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

6 голосов
/ 19 марта 2010

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

2 голосов
/ 28 мая 2010

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

1 голос
/ 16 февраля 2011

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

0 голосов
/ 13 мая 2016

У меня была та же проблема, что и у Андрея, и я попробовал несколько решений, которые нашел в сети.

У меня было ограничение по времени для каждой формы в моей программе (обратный отсчет) и вот как я это решил:

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

первым делом я удалил все таймеры из .cs и дизайна затем я добавил таймер в каждую форму и поместил разные имена для таймера и текстового поля и написал один и тот же код один за другим.

Я только что использовал timer.start () и Timer.stop ()

private void Form7_Load_1(object sender, EventArgs e)
    {
        timer7.Start();
    }

    int duration = 30;

    private void timer7_Tick(object sender, EventArgs e)
    {
        duration--;
        textBox7.Text = duration.ToString(); // to show the countdown 

        if (duration == 0)
        {
            timer7.Stop();
            MessageBox.Show("You ran out of time. Please go to the next page");

            this.Hide();
            Form8 f8 = new Form8();
            f8.ShowDialog();
        }
    }

надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...