Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/30: Рейтинг темы: голосов - 30, средняя оценка - 4.50
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923

Бесконечный цикл c Timer start/stop

14.05.2021, 18:42. Показов 6968. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создал таймер.
C#
1
private readonly System.Timers.Timer timer1 = new System.Timers.Timer();
Инициализирую в конструкторе.
C#
1
2
timer1.Interval = 250;
timer1.Elapsed += RunCoinValidator;
У меня есть монетоприёмник. Где-то там, в UI, я нажал на кнопку "Старт". Чтобы монетоприёмник работал, ему нужен вечный цикл, который отправляет нужые байты, извещая о работе.
C#
1
2
3
4
5
public void StartDevice()
{
    timer1.Stop();
    RunCoinValidator();
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void RunCoinValidator(object sender = null, System.Timers.ElapsedEventArgs e = null)
{
    timer1.Stop();
    try
    {
        while (Running)
        {
            // тут 1 триллиард строк
        }
    }
    catch
    {
        Running = false;
    }
}

При такой реализации у меня бесконечный цикл "блокирует" основной UI поток.
Вопрос весьма простой: как я могу не блогировать UI поток этим вечным циклом, при этом используя Timer?

Я бы мог сделать асинхронно или чере Task.Run() и т.д., но как я знаю Timer сам по себе поток.


Есть пример, но он не абстрактный, а под WinForms, я пытаюсь сделать так, чтобы он был как отдельный, не зависящий от UI проект.
Пример WinForms:
Кликните здесь для просмотра всего текста

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
        private System.Windows.Forms.Timer timer1;
 
        public Form1()
        {
            timer1.Interval = 250;
            reconnectionTimer.Tick += new EventHandler(reconnectionTimer_Tick);
            reconnectionTimer.Start();
        }
 
        void MainLoop()
        {
            while (Running)
            {
                // tick the timer
                timer1.Enabled = true;
                //...
                while (timer1.Enabled)
                {
                    Application.DoEvents();
                    Thread.Sleep(1); // Yield to free up CPU
                }
            }
        }
 
 
        private void timer1_Tick(object sender, EventArgs e)
        {
            timer1.Enabled = false;
        }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.05.2021, 18:42
Ответы с готовыми решениями:

Суть методов Start и Stop класса Timer
Собственно что за timer.start и timer.stop ? Что они делают? P.S не надо копировать мне msdn , я уже читал, и то что там, я не понимаю

Бесконечный цикл
Доброго времени суток! Столкнулся с такой проблемой. Вот условие. Вот код. В чем ошибка? Заранее благодарю!

Бесконечный цикл
Пишу утилиту, которая считывает данные из экселя раз в минуту. На форме два радиобатона вкл/вкл. (можно и что-нибудь другое, не важно) ...

29
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
18.05.2021, 10:55
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от limeniye Посмотреть сообщение
быстро кликаю на кнопку и отправляю за секунду 4-5 запросов -- валидатор "падает".
Цитата Сообщение от limeniye Посмотреть сообщение
Клик проходит. Там в лог выводит информацию, с ошибкой, что в валидаторе нет столько денег.
Так он падает или проходит?

Цитата Сообщение от limeniye Посмотреть сообщение
Но в примере с формами всё отрабатывает идеально, что меня смущает.
Дело не в Формах, а в том каким образом вызывается валидатор.
В Формах скорее всего вы всё реализовывали в Code Behind и всё работало в одном потоке.
Из-за быстроты отработки метода вы просто не замечали, что Форма на доли секунды подвисает.

Добавлено через 1 минуту
Цитата Сообщение от limeniye Посмотреть сообщение
Я попробовал сделать
Что это за метод Calculate?
Как он связан с кнопкой, её командой?
1
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
18.05.2021, 13:32  [ТС]
Так он падает или проходит?
Нет, нет, это в примере с формами. А у меня падает.
Я о том, что в формах кнопка не блокируется. Там есть лог, в который выводит информацию. И я вижу, что нажатие кнопки обрабатывается ошибкой в лог.

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

Что это за метод Calculate?
Как он связан с кнопкой, её командой?
Он делает некие предварительные подсчёт, а потом отправляет байты для Payout.

Дело не в Формах, а в том каким образом вызывается валидатор.
В Формах скорее всего вы всё реализовывали в Code Behind и всё работало в одном потоке.
Из-за быстроты отработки метода вы просто не замечали, что Форма на доли секунды подвисает.
Вот как. Хорошо. Тогда буду делать Execute.

Добавлено через 2 часа 21 минуту
Элд Хасп, Execute мне не помог. Дело не в нём. Ошибка происходт, когда я отправляю сам запрос в валидатор.
В Формах скорее всего вы всё реализовывали в Code Behind и всё работало в одном потоке.
Да, я тоже так понял, но я пробовал сделать lock самой калькуляции, а нужно было сделать lock самого ЗАПРОСА.

Я попробовал создать статическую переменную private static object locker = new object();
и отправку команды упаковал туда:
C#
1
2
3
4
5
6
7
8
9
10
11
12
        public bool SendCommand(string log)
        {
            lock (locker)
            {
                if (m_eSSP.SSPSendCommand(m_cmd, info) == false)
                {
                    m_eSSP.CloseComPort();
                    return false;
                }
                return true;
            }
        }
После ондого миллиарда способов и танцев с бубном -- это решило проблему)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
18.05.2021, 13:38
Цитата Сообщение от limeniye Посмотреть сообщение
После ондого миллиарда способов и танцев с бубном -- это решило проблему)
Локирование (lock) один из способов обеспечения потокобезопасности.
Для "быстрых" методов часто используется.

Но судя по коду у вас проблема с потокбезопасностью m_eSSP.
Поэтому всюду где обращаетесь в коде модели к этому объекту делайте локирование по нему:
C#
1
2
3
4
5
        public bool SendCommand(string log)
        {
            lock (m_eSSP)
            {
                if (m_eSSP.SSPSendCommand(m_cmd, info) == false)
Абстрактный locker не стоит в этом случае использовать.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
18.05.2021, 13:59
limeniye, хотя может ошибаюсь.
SendCommand - это команда Модели или VM?

По идее в Модели у вас должен быть некий объект отвечающий за связь с монетоприёмником.
Вот для потокобезопасности перед обращением к этому объекту и надо делать (в Модели) локирование по нему.
По этой причине для работы с ОДНИМ монетоприёмником должен создаваться только ОДИН объект.
Если в конфигурации компьютера предусматривается подключение только одного монетоприёмника, то Singleton идеально подходит.
1
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
18.05.2021, 15:53  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
SendCommand - это команда Модели или VM?
Это команда модели.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
По идее в Модели у вас должен быть некий объект отвечающий за связь с монетоприёмником.
Как я понял он посылает запрос, а значит и является этим самым объектом, отвечающим за связь с монетоприёмником.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если в конфигурации компьютера предусматривается подключение только одного монетоприёмника, то Singleton идеально подходит.
Конфигурации компьютера поддерживают и более приёмников, а вот конфигурации приложения, на данный момент -- один.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
18.05.2021, 16:07
Цитата Сообщение от limeniye Посмотреть сообщение
Конфигурации компьютера поддерживают и более приёмников, а вот конфигурации приложения, на данный момент -- один.
А вам как надо?
От этого зависит безопасное создание моделей монеториёмников и их внедрение.
1
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
18.05.2021, 16:31  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А вам как надо?
К счастью не нужно.

Но я думаю там всё безопасно должно быть, учитывая то, что там Mutex, Таймер и локирование запроса. Или этого недостаточно?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
18.05.2021, 16:33
Цитата Сообщение от limeniye Посмотреть сообщение
Но я думаю там всё безопасно должно быть, учитывая то, что там Mutex, Таймер и локирование запроса. Или этого недостаточно?
Если нужен только один экземпляр, то используйте Singleton и уже внутри него реализуйте локирование.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
18.05.2021, 17:34  [ТС]
Элд Хасп, а, Вы в этом плане. Я думал при условии, если валидаторы разные(следовательно и классы разные).

Хм. Я думал достаточно просто удалить Singlton и всё будет работать корректно.
Как же тогда делать синхронизацию потока?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
18.05.2021, 18:08
Цитата Сообщение от limeniye Посмотреть сообщение
Как же тогда делать синхронизацию потока?
Надо не поток синхронизировать.
А делать потокобезопасный доступ к устрорйству.
Чтобы к нему можно было обратиться из любого потока.

Добавлено через 5 минут
Условно.
У вас устройство подсоединено к какому-то порту с такими-то параметрами.
Создаёте экземпляр Модели для работы с ним.
Модель сохраняется в статическом свойстве.
При попытке следующего создания экземпляра возвращается или ранее созданный экземпляр, или выкидывается исключение - вариант определяется условиями ТЗ.
В самой Модели есть несколько методов для работы с устройством.
Если они все работают быстро (доли секунды), то во всех методах перед обращением устройству сначала происходит его локирование.
Так как к устройству может обращаться только одна Модель, то обеспечит потокобезопасность.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.05.2021, 18:08

Бесконечный цикл
private void button1_Click(object sender, EventArgs e) { do { if (button1.Text ==...

Бесконечный цикл
Сделал класс с методами для конвертации из двенадцатеричной системы счисления в двоичную. Бесконечный цикл возникает после создания...

Бесконечный цикл
Хелп, не могу избавиться от бесконечной рекурсии public void Run2(string str,int i) { char c; ...

Бесконечный цикл
Как сделать чтобы в консольном приложении цикл выполнялся бесконечно и без остановок, но если я нажму эскейп например, то выходило из...

Бесконечный цикл с задержкой
Нужен бесконечный цикл с периодом выполнения в 1 сек for (int i = 0; i < 10; i++) { ...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru