powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Периодическая отправка команд на сетевые устройства
25 сообщений из 61, страница 1 из 3
Периодическая отправка команд на сетевые устройства
    #38759633
Фотография Капюшон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Форумчане, подскажите, пожалуйста, как правильно решить на C# такую задачу.
Есть WinForms приложение, за которым работает оператор. Там открыт список, скадем так, приемников, который выглядит так:

Приемник 1
Приемник 2
Приемник 3
...
Приемник 85
...

Требуется периодически рассылать сигналы на эти приемники, причем с индивидуальными интервалами.
Т.е. оператор может кликнуть, например, на приемник 3 с задать ему интервал, скажем, 25 секунд. И теперь каждые 25 секунд на этот приемник должен отправляться сигнал. Потом он может назначить иной интервал на приемник 12, напрмер, 180 секунд. И т.п...
Как это реализовать? Пул потоков? Массив таймеров? :–) Есть ли элегантное решение?
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38759641
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один из вариантов решений:
1) Создаете очередь.
2) В эту очередь для каждого приемника вы кладете объект вида:
{
int id; // Какой-то иентификатор приемника
long pingTime; // Время в тиках, когда надо инициировать событие.
long interval; // Через какое время после текущего события надо инициировать следующее.
}
Объекты в очереди должны быть отсортированы по pingTime.

3) Далее, у вас есть 1 (один) поток. Он смотрит на голову очереди, берет pingTime, вычитает из него текущее время, получает TimeSpan. Далее вы усыпляете поток черeз Thread.Wait() на этот интервал. Когда поток просыпается, он отправляет асинхронный запрос, этот элемент удаляется из очереди, но создается новый для этого же идентификатора, у которого pingTime = oldPingTime + interval. И так далее.
Для усыпления потока надо делать именно Thread.Wait(), а не Sleep(), так как в случае, если вы добавите новый элемент, который должен будет выстрелить раньше, чем самый первый элемент в очереди, вам надо разбудить этот поток, и заставить его посмотреть на новую голову очереди.

Ну короче все просто, там 50 строк кода мяксимум.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38759649
Фотография Капюшон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Круто вы придумали, спасибо, надо попробовать!..
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38759859
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvДалее вы усыпляете поток черeз Thread.Wait() на этот интервал.
Это откуда?
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38759878
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvДля усыпления потока надо делать именно Thread.Wait(), а не Sleep()
Нюанс в том, что у класса Thread нет метода Wait
http://msdn.microsoft.com/ru-ru/library/System.Threading.Thread_methods(v=vs.110).aspx
есть SpinWait, который вообще не подходит для манипуляции временными промежутками
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38759917
Фотография Капюшон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И то верно! Как же быть??
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38759920
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очередная поделка для рассылки спама?
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38759926
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,
Monitor.Wait()
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38759933
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvСон Веры Павловны,
Monitor.Wait()
Да, спасибо, я в курсе, но мне это зачем? у меня вышеописанной задачи не возникало.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38759935
Фотография Капюшон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причем тут рассылка спама, приложение вовсе не для этого. Оно взаимодействует с сетевыми устройствами.

cdtyjv, спасибо, попробую разобраться с Monitor.Wait (ни разу не использовал этот метод ранее)
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38759945
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КапюшонФорумчане, подскажите, пожалуйста, как правильно решить на C# такую задачу.
Есть WinForms приложение, за которым работает оператор. Там открыт список, скадем так, приемников, который выглядит так:

Приемник 1
Приемник 2
Приемник 3
...
Приемник 85
...

Требуется периодически рассылать сигналы на эти приемники, причем с индивидуальными интервалами.
Т.е. оператор может кликнуть, например, на приемник 3 с задать ему интервал, скажем, 25 секунд. И теперь каждые 25 секунд на этот приемник должен отправляться сигнал. Потом он может назначить иной интервал на приемник 12, напрмер, 180 секунд. И т.п...
Как это реализовать? Пул потоков? Массив таймеров? :–) Есть ли элегантное решение?

Смотрели Quartz.Net ?
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760041
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Смотрели Quartz.Net ?Порт с Java. Если посмотреть на исходники (классы QuartzScheduler и QuartzSchedulerThread в Java, что-то похожее и в .Net), то вы увидите, что он работает именно так, как я описал выше: один "поток-стрелялка" с простейшей логикой на Wait()/PulseAll().
Стоит ли ради такой ерунды подцеплять себе дополнительный DLL - хз, надо смотреть по ситуации. Если это разовое требование с простой логикой - то лучше написать руками, так как разобраться в API Кварца и формате cron-выражений (которые хорошо знакомы линуксоидам, но от которых выворачивает наизнанку окошечников) займет столько же времени, сколько и написать этот функционал самому.
Если же заведомо известно, что требования по этому функционалу будут с большой вероятностью обрастать всякими хотелками, то надо сопоставить их с API Кварца, и возможно действительно выбрать его.

Не надо бояться реализовывать какие-то относительно простые низкоуровневые вещи самому.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760138
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КапюшонКак это реализовать? Пул потоков? Массив таймеров? :–) Есть ли элегантное решение?Массив таймеров, работающих через пул потоков (System.Threading.Timer).
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760139
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvMonitor.Wait()Ужасы какие...
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760158
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv,
Ну, порт. Разве от этого кому-то плохо? У ТС какое то рабочее место. Мне кажется, ничего страшного, если он освоит хороший Фреймворк. К тому же у меня есть опасения, что он с ручной реализацией больше провозится
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760172
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМассив таймеров, работающих через пул потоков (System.Threading.Timer).
одного секундного достаточно :)
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760186
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КcdtyjvMonitor.Wait()Ужасы какие...Что ужасного? Вы не в состоянии разобраться в работе методов Wait/Pulse/PulseAll? Нам еще на студенческой скамье задачки на это давали.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760225
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvАлексей Кпропущено...
Ужасы какие...Что ужасного? Вы не в состоянии разобраться в работе методов Wait/Pulse/PulseAll? Один поток - это обычно 1 МБ ОЗУ под стек плюс прочие оверхеды. Ты предлагаешь на пустом месте создать ничего не делающий поток. Делай выводы.
cdtyjvНам еще на студенческой скамье задачки на это давали.Это тебя не оправдывает.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760239
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЧто ужасного? Вы не в состоянии разобраться в работе методов Wait/Pulse/PulseAll? Один поток - это обычно 1 МБ ОЗУ под стек плюс прочие оверхеды. Ты предлагаешь на пустом месте создать ничего не делающий поток. Делай выводы.[/quot]Я ожидал услышать что-угодно (например, что разработчикам .Net не кошерно руками работать с Wait/Pulse), но только не такую чушь. Мама-дорогая! Целый тред! Целый 1 (один) мегабайт!!! Это же ... 1 / 4 * 1024 = 0.025% от памяти доступной на самом захудалом ноутбуке, который сейчас можно купить!

P.S.: Вы это серьезно вообще?
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760242
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КОдин поток - это обычно 1 МБ ОЗУ под стек плюс прочие оверхеды. Ты предлагаешь на пустом месте создать ничего не делающий поток. Делай выводы.Я ожидал услышать что-угодно (например, что разработчикам .Net не кошерно руками работать с Wait/Pulse), но только не такую чушь. Мама-дорогая! Целый тред! Целый 1 (один) мегабайт!!! Это же ... 1 / 4 * 1024 = 0.025% от памяти доступной на самом захудалом ноутбуке, который сейчас можно купить!

P.S.: Вы это серьезно вообще?
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760248
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvАлексей КОдин поток - это обычно 1 МБ ОЗУ под стек плюс прочие оверхеды. Ты предлагаешь на пустом месте создать ничего не делающий поток. Делай выводы.Я ожидал услышать что-угодно (например, что разработчикам .Net не кошерно руками работать с Wait/Pulse), но только не такую чушь. Мама-дорогая! Целый тред! Целый 1 (один) мегабайт!!! Это же ... 1 / 4 * 1024 = 0.025% от памяти доступной на самом захудалом ноутбуке, который сейчас можно купить!

P.S.: Вы это серьезно вообще?Ну если есть нормальный System.Threading.Timer, зачем делать через ж@пу? Кроме оверхеда, решение через таймер проще.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760249
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала, если есть устройства, которым с какой то периодичностью надо что-то слать, то делать это через WinForms приложение - моветон. А если его случайно закроют? Или еще что?

Было бы логично написать windows-сервис, которому дать расписание посылки сигналов и, при необходимости, содержимое этих сигналов. А WinForms - это админка к сервису.

Далее, что такое 1 лишний МБ на проект? Чай, не микроконтроллеры программируем, можно внимания не обращать.

В-третьих, поток действительно не нужен, достаточно сделать таймер, срабатывающий, скажем, с интервалом менее допустимой погрешности для устройства. И по таймеру пробегаться по списку приемников и определять какие нужно обрабатывать. А список, например, какой-нить sortedlist по дате срабатывания, чтобы при вставке очередного сообщения оно встало куда нужно. Правда, свеном назвал это очередью - по сути правильно, но может запутать в используемых классах

Ну и, если интервал сильно нужно выдерживать, необходимо учитывать, что время на компе может синхронизироваться (NTP) и колебаться в ту или иную сторону. Редкость, конечно, но мы же не знаем всех требований к проекту.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760253
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей КМассив таймеров, работающих через пул потоков (System.Threading.Timer).
одного секундного достаточно :)Можно и так.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760265
Фотография Капюшон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/*Смотрели Quartz.Net? */
— Согласен с cdtyjv, как-то тяжеловесно, если не получится штатными средствами, то на крайняк можно посмотреть, но за ссылку спасибо.


/*Массив таймеров, работающих через пул потоков (*/
— хорошая шутка!


/* 1 МБ ОЗУ */
— хорошая шутка!


/* делать это через WinForms приложение - моветон*/
— в общем случае да, но в данном моем случае должно быть именно так.


/* достаточно сделать таймер, срабатывающий, скажем, с интервалом менее допустимой погрешности для устройства*/
— да, это и мне в голову приходило... но это как-то топорно, не элегантно что ли... но вариант рабочий вполне, согласен.


Пока что я буду разбираться с Monitor.Wait.
В любом случае обязуюсь доложить о результатах в течение месяца :–)
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760275
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Далее, что такое 1 лишний МБ на проект?100 потоков - это уже 100 МБ. Много это или мало? Для того и изобретёны пул потоков и событийная модель Task/async/await, чтобы избегать "спящих" потоков. Глупо это не использовать.
...
Рейтинг: 0 / 0
25 сообщений из 61, страница 1 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Периодическая отправка команд на сетевые устройства
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]