Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 15
1

не срабатывает Timer Callback, и не выполняются события

24.03.2013, 10:59. Показов 2411. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день! Решил написать схему переключения светофора, основанную на событиях. Заодно опробовал System.Threading.Timer. Получился вот такой код.

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
    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;
        }
    }
Объясните, пожалуйста, в чем тут дело.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.03.2013, 10:59
Ответы с готовыми решениями:

Выполняются ли callback функции в отдельном потоке (потоках)?
Или внутри функции DispatchMessage? Или есть несколько потоков для обработки...

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

Callback function срабатывает несколько раз
Здравствуйте ! Ситуация следующая . Есть две кнопки, на них вешаем onclick . Вопрос почему при...

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

9
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
24.03.2013, 11:15 2
Да ты шутник . Создаёшь 10000 таймеров и сразу же освобождаешь у них ресурсы.

Добавлено через 1 минуту
Чёт я вообще не пойму, как оно должно работать.

Добавлено через 27 секунд
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
    class Program
    {
        static void Main(string[] args)
        {
            LightEvent  le = new LightEvent(3, 3, 3);
            le.DoWorkLight();
 
            Console.ReadKey();
        }
    }
 
    class LightEvent
    {
        public delegate void LightEventHandler();
 
        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 event LightEventHandler Green;
        public event LightEventHandler Yellow;
        public event LightEventHandler Red;
 
        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;
        }
    }
Дальше что?

Добавлено через 1 минуту
А-а-а, кажись понял идею
0
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 15
24.03.2013, 11:18  [ТС] 3
Ну я хочу, чтобы это выглядело так: на форме нажимаешь на кнопку, в результате вызывается функция DoWorkLight() и работает на протяжении некоторого количества циклов.

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

UPD. Еще, если можно, расскажите, пожалуйста, зачем нужен второй параметр Object state при создании таймера. Просто только недавно начал в программировании разбираться. Буду задавать нубские вопросы.
0
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
24.03.2013, 11:41 4
Я вот пытался заставить работать в консоли, но там что-то не срабатывает из-за потоков помоему, в формах бы вызвал Invoke у контрола или использовал бы другой таймер.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Contexts;
using System.Text;
using System.Threading;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            LightEvent le = new LightEvent(3, 3, 3);
 
            le.Green += () => WriteColoredLine(ConsoleColor.Green, "Горит зелёный");
            le.Yellow += () => WriteColoredLine(ConsoleColor.Yellow, "Горит жёлтый");
            le.Red += () => WriteColoredLine(ConsoleColor.Red, "Горит красный");
            le.DoWorkLight();
 
            Console.ReadKey();
        }
 
        static void WriteColoredLine(ConsoleColor color, string text)
        {
            WriteColoredLine(color, text, null);
        }
 
        static void WriteColoredLine(ConsoleColor color, string text, params object[] args)
        {
            ConsoleColor currentColor = Console.ForegroundColor;
            Console.ForegroundColor = color;
            if (args == null)
                Console.WriteLine(text);
            else
                Console.WriteLine(text, args);
            Console.ForegroundColor = currentColor;
        }
    }
 
    class LightEvent : IDisposable
    {
        public delegate void LightEventHandler();
 
        System.Threading.Timer _timer;
        TimerCallback _tcb;
        private int _interval;
        private int _greenInterval;
        private int _yellowInterval;
        private int _redInterval;
 
        public LightEvent(int green, int yellow, int red)
        {
            _greenInterval = green * 1000;
            _yellowInterval = yellow * 1000;
            _redInterval = red * 1000;
        }
 
        public event LightEventHandler Green;
        public event LightEventHandler Yellow;
        public event LightEventHandler Red;
 
        public void DoWorkLight()
        {
            _interval = _greenInterval;
            _tcb = TimerGreen;
            _timer = new System.Threading.Timer(_tcb, false, _interval, _interval);
        }
 
        public void TimerGreen(object source)
        {
            var handler = Yellow;
            if (handler != null)
            {
                handler();
            }
            _tcb = TimerYellow;
            _interval = _yellowInterval;
        }
 
        public void TimerYellow(object source)
        {
            var handler = Red;
            if (handler != null)
                handler();
            _tcb = TimerRed;
            _interval = _redInterval;
        }
 
        public void TimerRed(object source)
        {
            var handler = Green;
            if (handler != null)
                handler();
            _tcb = TimerGreen;
            _interval = _greenInterval;
        }
 
        public void Dispose()
        {
            if (_timer != null)
            {
                _timer.Dispose();
            }
        }
    }
}
Добавлено через 1 минуту
Цитата Сообщение от binomer Посмотреть сообщение
сли не освобождать ресурсы, то форма закрывается почему-то по истечении первого таймера.
Цитата Сообщение от binomer Посмотреть сообщение
Еще, если можно, расскажите, пожалуйста, зачем нужен второй параметр Object state при создании таймера.
Вот никогда не понимал, что сложного взять ввести _timer = new System.Threading.Timer( появится IntelliSense, с помощью которого можно прочитать для чего нужен каждый параметр или кликнуть на названии метода/конструктора/свойста и т.д. и нажать F1???

Добавлено через 3 минуты
Цитата Сообщение от Casper-SC Посмотреть сообщение
C#
1
_interval = _redInterval;
Эта строка в каждом методе ничего не даст.
0
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 15
24.03.2013, 11:45  [ТС] 5
Цитата Сообщение от Casper-SC Посмотреть сообщение
Вот никогда не понимал, что сложного взять ввести _timer = new System.Threading.Timer( появится IntelliSense, с помощью которого можно прочитать для чего нужен каждый параметр или кликнуть на названии метода/конструктора/свойста и т.д. и нажать F1???
Читал. И в MSDN смотрел. Пока не помогло. Я просто в моем примере не заметил разницы для этого элемента.

Цитата Сообщение от Casper-SC Посмотреть сообщение
Эта строка в каждом методе ничего не даст.
Как это ничего не даст, мне нужно менять время срабатывания таймера, ибо время цветов светофора может быть разным.
0
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
24.03.2013, 11:48 6
Цитата Сообщение от binomer Посмотреть сообщение
Как это ничего не даст, мне нужно менять время срабатывания таймера, ибо время цветов светофора может быть разным.
Ну ты меняешь значение переменной и всё, толку его менять, на таймер это никак не влияет.

Добавлено через 1 минуту
Обязательно вообще этот таймер использовать?
0
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 15
24.03.2013, 11:54  [ТС] 7
Цитата Сообщение от Casper-SC Посмотреть сообщение
Ну ты меняешь значение переменной и всё, толку его менять, на таймер это никак не влияет.
Как видишь, я хотел обойтись одним таймером. Для этой цели и изменение временного интервала в коллбэке таймера

Цитата Сообщение от Casper-SC Посмотреть сообщение
Обязательно вообще этот таймер использовать?
Я очень хочу выслушать, как можно сделать еще.

Просто светофор, по идее, должен работать без моего участия. Запустил себе и работает. "Отсылает" события, а обработчики событий будут в другом классе. В них будет реализовано движение машин. Типа, пришел сигнал красного света, значит, машины из очереди не выпускаем. Пришел сигнал зеленого, тогда считаем и исключаем из очереди некоторое количество машин.
0
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
24.03.2013, 12:06 8
C#
1
            _tcb = TimerYellow;
Такие строки тоже на таймер не влияют, так как таймер получает копию ссылки, а ты меняешь совсем другую ссылку.
0
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
24.03.2013, 12:08 9
В общем надо уходить, но сделал наспех:
Вложения
Тип файла: rar WinForms_TrafficLights.rar (46.8 Кб, 19 просмотров)
1
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 15
24.03.2013, 12:09  [ТС] 10
Цитата Сообщение от Casper-SC Посмотреть сообщение
C#
1
            _tcb = TimerYellow;
Такие строки тоже на таймер не влияют, так как таймер получает копию ссылки, а ты меняешь совсем другую ссылку.
Ээээ...как тогда быть?

Уже понял, как тогда быть.
0
24.03.2013, 12:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.03.2013, 12:09
Помогаю со студенческими работами здесь

Timer Tick не срабатывает
Доброго времени суток. Возникла проблема с срабатыванием события Tick: С тела функции Game не...

Windows Service. Timer не срабатывает
День добрый. Извините, если не в тот раздел пишу... Проблема в следующем: Решил написать...

Timer Срабатывание события Tick
Подскажите пожалуйста, каждое следующее событие Tick будет срабатывать с учетом времени работы...

Почему не срабатывает прерывание по переполнению таймера Timer/Counter0
Добрый день! В чем грабли, почему не запускается подпрограмма обработки прерывания по переполнению...

Обработчик события OnTimer компонента Timer
Помогите создать обработчик событий OnTimer компонента Timer, который отображает каждую секунду...

Обработка события Timer.Tick не в классе форме
Есть массив классов, в каждом экземпляре класса есть таймер и булева переменная. Класс не находится...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru