|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Форумчане, подскажите, пожалуйста, как правильно решить на C# такую задачу. Есть WinForms приложение, за которым работает оператор. Там открыт список, скадем так, приемников, который выглядит так: Приемник 1 Приемник 2 Приемник 3 ... Приемник 85 ... Требуется периодически рассылать сигналы на эти приемники, причем с индивидуальными интервалами. Т.е. оператор может кликнуть, например, на приемник 3 с задать ему интервал, скажем, 25 секунд. И теперь каждые 25 секунд на этот приемник должен отправляться сигнал. Потом он может назначить иной интервал на приемник 12, напрмер, 180 секунд. И т.п... Как это реализовать? Пул потоков? Массив таймеров? :–) Есть ли элегантное решение? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2014, 22:06 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Один из вариантов решений: 1) Создаете очередь. 2) В эту очередь для каждого приемника вы кладете объект вида: { int id; // Какой-то иентификатор приемника long pingTime; // Время в тиках, когда надо инициировать событие. long interval; // Через какое время после текущего события надо инициировать следующее. } Объекты в очереди должны быть отсортированы по pingTime. 3) Далее, у вас есть 1 (один) поток. Он смотрит на голову очереди, берет pingTime, вычитает из него текущее время, получает TimeSpan. Далее вы усыпляете поток черeз Thread.Wait() на этот интервал. Когда поток просыпается, он отправляет асинхронный запрос, этот элемент удаляется из очереди, но создается новый для этого же идентификатора, у которого pingTime = oldPingTime + interval. И так далее. Для усыпления потока надо делать именно Thread.Wait(), а не Sleep(), так как в случае, если вы добавите новый элемент, который должен будет выстрелить раньше, чем самый первый элемент в очереди, вам надо разбудить этот поток, и заставить его посмотреть на новую голову очереди. Ну короче все просто, там 50 строк кода мяксимум. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2014, 22:24 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Круто вы придумали, спасибо, надо попробовать!.. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2014, 23:26 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
cdtyjvДалее вы усыпляете поток черeз Thread.Wait() на этот интервал. Это откуда? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2014, 16:28 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
cdtyjvДля усыпления потока надо делать именно Thread.Wait(), а не Sleep() Нюанс в том, что у класса Thread нет метода Wait http://msdn.microsoft.com/ru-ru/library/System.Threading.Thread_methods(v=vs.110).aspx есть SpinWait, который вообще не подходит для манипуляции временными промежутками ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2014, 17:12 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
И то верно! Как же быть?? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2014, 18:54 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Очередная поделка для рассылки спама? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2014, 19:07 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, Monitor.Wait() ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2014, 19:19 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
cdtyjvСон Веры Павловны, Monitor.Wait() Да, спасибо, я в курсе, но мне это зачем? у меня вышеописанной задачи не возникало. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2014, 19:46 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Причем тут рассылка спама, приложение вовсе не для этого. Оно взаимодействует с сетевыми устройствами. cdtyjv, спасибо, попробую разобраться с Monitor.Wait (ни разу не использовал этот метод ранее) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2014, 19:52 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
КапюшонФорумчане, подскажите, пожалуйста, как правильно решить на C# такую задачу. Есть WinForms приложение, за которым работает оператор. Там открыт список, скадем так, приемников, который выглядит так: Приемник 1 Приемник 2 Приемник 3 ... Приемник 85 ... Требуется периодически рассылать сигналы на эти приемники, причем с индивидуальными интервалами. Т.е. оператор может кликнуть, например, на приемник 3 с задать ему интервал, скажем, 25 секунд. И теперь каждые 25 секунд на этот приемник должен отправляться сигнал. Потом он может назначить иной интервал на приемник 12, напрмер, 180 секунд. И т.п... Как это реализовать? Пул потоков? Массив таймеров? :–) Есть ли элегантное решение? Смотрели Quartz.Net ? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2014, 20:15 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Arm79Смотрели Quartz.Net ?Порт с Java. Если посмотреть на исходники (классы QuartzScheduler и QuartzSchedulerThread в Java, что-то похожее и в .Net), то вы увидите, что он работает именно так, как я описал выше: один "поток-стрелялка" с простейшей логикой на Wait()/PulseAll(). Стоит ли ради такой ерунды подцеплять себе дополнительный DLL - хз, надо смотреть по ситуации. Если это разовое требование с простой логикой - то лучше написать руками, так как разобраться в API Кварца и формате cron-выражений (которые хорошо знакомы линуксоидам, но от которых выворачивает наизнанку окошечников) займет столько же времени, сколько и написать этот функционал самому. Если же заведомо известно, что требования по этому функционалу будут с большой вероятностью обрастать всякими хотелками, то надо сопоставить их с API Кварца, и возможно действительно выбрать его. Не надо бояться реализовывать какие-то относительно простые низкоуровневые вещи самому. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 00:49 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
КапюшонКак это реализовать? Пул потоков? Массив таймеров? :–) Есть ли элегантное решение?Массив таймеров, работающих через пул потоков (System.Threading.Timer). ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 05:53 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
cdtyjvMonitor.Wait()Ужасы какие... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 05:54 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
cdtyjv, Ну, порт. Разве от этого кому-то плохо? У ТС какое то рабочее место. Мне кажется, ничего страшного, если он освоит хороший Фреймворк. К тому же у меня есть опасения, что он с ручной реализацией больше провозится ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 07:33 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Алексей КМассив таймеров, работающих через пул потоков (System.Threading.Timer). одного секундного достаточно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 08:15 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Алексей КcdtyjvMonitor.Wait()Ужасы какие...Что ужасного? Вы не в состоянии разобраться в работе методов Wait/Pulse/PulseAll? Нам еще на студенческой скамье задачки на это давали. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 08:43 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
cdtyjvАлексей Кпропущено... Ужасы какие...Что ужасного? Вы не в состоянии разобраться в работе методов Wait/Pulse/PulseAll? Один поток - это обычно 1 МБ ОЗУ под стек плюс прочие оверхеды. Ты предлагаешь на пустом месте создать ничего не делающий поток. Делай выводы. cdtyjvНам еще на студенческой скамье задачки на это давали.Это тебя не оправдывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 09:54 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Алексей КЧто ужасного? Вы не в состоянии разобраться в работе методов Wait/Pulse/PulseAll? Один поток - это обычно 1 МБ ОЗУ под стек плюс прочие оверхеды. Ты предлагаешь на пустом месте создать ничего не делающий поток. Делай выводы.[/quot]Я ожидал услышать что-угодно (например, что разработчикам .Net не кошерно руками работать с Wait/Pulse), но только не такую чушь. Мама-дорогая! Целый тред! Целый 1 (один) мегабайт!!! Это же ... 1 / 4 * 1024 = 0.025% от памяти доступной на самом захудалом ноутбуке, который сейчас можно купить! P.S.: Вы это серьезно вообще? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 10:07 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Алексей КОдин поток - это обычно 1 МБ ОЗУ под стек плюс прочие оверхеды. Ты предлагаешь на пустом месте создать ничего не делающий поток. Делай выводы.Я ожидал услышать что-угодно (например, что разработчикам .Net не кошерно руками работать с Wait/Pulse), но только не такую чушь. Мама-дорогая! Целый тред! Целый 1 (один) мегабайт!!! Это же ... 1 / 4 * 1024 = 0.025% от памяти доступной на самом захудалом ноутбуке, который сейчас можно купить! P.S.: Вы это серьезно вообще? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 10:08 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
cdtyjvАлексей КОдин поток - это обычно 1 МБ ОЗУ под стек плюс прочие оверхеды. Ты предлагаешь на пустом месте создать ничего не делающий поток. Делай выводы.Я ожидал услышать что-угодно (например, что разработчикам .Net не кошерно руками работать с Wait/Pulse), но только не такую чушь. Мама-дорогая! Целый тред! Целый 1 (один) мегабайт!!! Это же ... 1 / 4 * 1024 = 0.025% от памяти доступной на самом захудалом ноутбуке, который сейчас можно купить! P.S.: Вы это серьезно вообще?Ну если есть нормальный System.Threading.Timer, зачем делать через ж@пу? Кроме оверхеда, решение через таймер проще. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 10:11 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Для начала, если есть устройства, которым с какой то периодичностью надо что-то слать, то делать это через WinForms приложение - моветон. А если его случайно закроют? Или еще что? Было бы логично написать windows-сервис, которому дать расписание посылки сигналов и, при необходимости, содержимое этих сигналов. А WinForms - это админка к сервису. Далее, что такое 1 лишний МБ на проект? Чай, не микроконтроллеры программируем, можно внимания не обращать. В-третьих, поток действительно не нужен, достаточно сделать таймер, срабатывающий, скажем, с интервалом менее допустимой погрешности для устройства. И по таймеру пробегаться по списку приемников и определять какие нужно обрабатывать. А список, например, какой-нить sortedlist по дате срабатывания, чтобы при вставке очередного сообщения оно встало куда нужно. Правда, свеном назвал это очередью - по сути правильно, но может запутать в используемых классах Ну и, если интервал сильно нужно выдерживать, необходимо учитывать, что время на компе может синхронизироваться (NTP) и колебаться в ту или иную сторону. Редкость, конечно, но мы же не знаем всех требований к проекту. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 10:11 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
ИзопропилАлексей КМассив таймеров, работающих через пул потоков (System.Threading.Timer). одного секундного достаточно :)Можно и так. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 10:16 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
/*Смотрели Quartz.Net? */ — Согласен с cdtyjv, как-то тяжеловесно, если не получится штатными средствами, то на крайняк можно посмотреть, но за ссылку спасибо. /*Массив таймеров, работающих через пул потоков (*/ — хорошая шутка! /* 1 МБ ОЗУ */ — хорошая шутка! /* делать это через WinForms приложение - моветон*/ — в общем случае да, но в данном моем случае должно быть именно так. /* достаточно сделать таймер, срабатывающий, скажем, с интервалом менее допустимой погрешности для устройства*/ — да, это и мне в голову приходило... но это как-то топорно, не элегантно что ли... но вариант рабочий вполне, согласен. Пока что я буду разбираться с Monitor.Wait. В любом случае обязуюсь доложить о результатах в течение месяца :–) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 10:29 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Arm79Далее, что такое 1 лишний МБ на проект?100 потоков - это уже 100 МБ. Много это или мало? Для того и изобретёны пул потоков и событийная модель Task/async/await, чтобы избегать "спящих" потоков. Глупо это не использовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 10:38 |
|
|
start [/forum/topic.php?fid=20&fpage=106&tid=1402396]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
62ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 320ms |
total: | 479ms |
0 / 0 |