Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > не срабатывает Timer Callback


Автор: binomer 24.3.2013, 09:51
Добрый день! Решил написать схему переключения светофора, основанную на событиях. Заодно опробовал System.Threading.Timer. Получился вот такой код.

Проблема заключается в том, что не включаются события, определенные в TimerGreen, TimerRed, TimerYelllow
Код

    class LightEvent
    {
        public delegate void LightEventHandler();

        public event LightEventHandler Green;
        public event LightEventHandler Yellow;
        public event LightEventHandler Red;

        System.Threading.Timer timer;
        TimerCallback tcb;
        private int interval;

        private int green;
        private int yellow;
        private int red;

        public LightEvent(int _green, int _yellow, int _red)
        {
            green = _green * 1000;
            yellow = _yellow * 1000;
            red = _red * 1000;
        }

        public void DoWorkLight()
        {
            interval = green;
            tcb = TimerGreen;
            for (int i = 0; i < 10000; i++)
            {
                timer = new System.Threading.Timer(tcb, false, interval, 0);
                timer.Dispose();
            }
        }


        public void TimerGreen(object source)
        {
            if (Yellow != null)
                Yellow();
            tcb = TimerYellow;
            interval = yellow;
        }

        public void TimerYellow(object source)
        {
            if (Red != null)
                Red();
            tcb = TimerRed;
            interval = red;
        }
        public void TimerRed(object source)
        {
            if (Green != null)
                Green();
            tcb = TimerGreen;
            interval = green;
        }
    }


Объясните, пожалуйста, в чем тут дело.

Автор: diadiavova 24.3.2013, 10:41
Цитата(binomer @  24.3.2013,  10:51 Найти цитируемый пост)
                timer = new System.Threading.Timer(tcb, false, interval, 0);
                timer.Dispose();

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

Автор: binomer 24.3.2013, 10:59
Цитата(diadiavova @ 24.3.2013,  10:41)
Цитата(binomer @  24.3.2013,  10:51 Найти цитируемый пост)
                timer = new System.Threading.Timer(tcb, false, interval, 0);
                timer.Dispose();

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

окей, спасибо за подсказку, но если не уничтожать, то форма, где используется данный метод (т.е. начинает работать таймер) закрывается после первого же срабатывания таймера.

Автор: diadiavova 24.3.2013, 11:21
Цитата(binomer @  24.3.2013,  11:59 Найти цитируемый пост)
но если не уничтожать, то форма, где используется данный метод (т.е. начинает работать таймер) закрывается после первого же срабатывания таймера. 

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

Автор: phomm 24.3.2013, 20:50
Есть вот такое http://programmersforum.ru/showthread.php?t=230009
Но там нет потоков и событий, всё на 1 таймере. Надо ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)