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

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

Требуется периодически рассылать сигналы на эти приемники, причем с индивидуальными интервалами.
Т.е. оператор может кликнуть, например, на приемник 3 с задать ему интервал, скажем, 25 секунд. И теперь каждые 25 секунд на этот приемник должен отправляться сигнал. Потом он может назначить иной интервал на приемник 12, напрмер, 180 секунд. И т.п...
Как это реализовать? Пул потоков? Массив таймеров? :–) Есть ли элегантное решение?
...
Рейтинг: 0 / 0
27.09.2014, 22:24
    #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
27.09.2014, 23:26
    #38759649
Капюшон
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Периодическая отправка команд на сетевые устройства
Круто вы придумали, спасибо, надо попробовать!..
...
Рейтинг: 0 / 0
28.09.2014, 16:28
    #38759859
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Периодическая отправка команд на сетевые устройства
cdtyjvДалее вы усыпляете поток черeз Thread.Wait() на этот интервал.
Это откуда?
...
Рейтинг: 0 / 0
28.09.2014, 17:12
    #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
28.09.2014, 18:54
    #38759917
Капюшон
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Периодическая отправка команд на сетевые устройства
И то верно! Как же быть??
...
Рейтинг: 0 / 0
28.09.2014, 19:07
    #38759920
EDUARD SAPOTSKI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Периодическая отправка команд на сетевые устройства
Очередная поделка для рассылки спама?
...
Рейтинг: 0 / 0
28.09.2014, 19:19
    #38759926
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Периодическая отправка команд на сетевые устройства
Сон Веры Павловны,
Monitor.Wait()
...
Рейтинг: 0 / 0
28.09.2014, 19:46
    #38759933
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Периодическая отправка команд на сетевые устройства
cdtyjvСон Веры Павловны,
Monitor.Wait()
Да, спасибо, я в курсе, но мне это зачем? у меня вышеописанной задачи не возникало.
...
Рейтинг: 0 / 0
28.09.2014, 19:52
    #38759935
Капюшон
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Периодическая отправка команд на сетевые устройства
Причем тут рассылка спама, приложение вовсе не для этого. Оно взаимодействует с сетевыми устройствами.

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

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

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

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

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

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

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

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

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

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

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

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


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


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


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


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


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


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