powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Периодическая отправка команд на сетевые устройства
61 сообщений из 61, показаны все 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
Периодическая отправка команд на сетевые устройства
    #38760287
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К100 потоков - это уже 100 МБ. Много это или мало?
Осталось только увидеть в совете свенома где же эти 100 потоков?

Лично я понял так, что поток был заведен только для того, чтобы не лочить UI. Поэтому он и один. Иногда и я так делаю, бывает проще чем с таймером. Не всегда, но бывает. Например, когда нужно не с каким то интервалом что-то дергать, а выдерживать интервал между окончанием обработки одной итерации и началом работы другой.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760297
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Алексей К100 потоков - это уже 100 МБ. Много это или мало?
Иногда и я так делаю, бывает проще чем с таймером. Не всегда, но бывает. Например, когда нужно не с каким то интервалом что-то дергать, а выдерживать интервал между окончанием обработки одной итерации и началом работы другой.

Так с таймером жеж то же самое
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
_timerDB = new System.Threading.Timer(TimerMethod,null,Timeout.Infinite, Timeout.Infinite);
_timerDB.Change(_ProcessQueueDelay, Timeout.Infinite);

private void TimerMethod(Object state)
        {
              ............
               _timerDB.Change(_ProcessQueueDelay, Timeout.Infinite);
        }
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760304
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisArm79пропущено...

Иногда и я так делаю, бывает проще чем с таймером. Не всегда, но бывает. Например, когда нужно не с каким то интервалом что-то дергать, а выдерживать интервал между окончанием обработки одной итерации и началом работы другой.

Так с таймером жеж то же самое
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
_timerDB = new System.Threading.Timer(TimerMethod,null,Timeout.Infinite, Timeout.Infinite);
_timerDB.Change(_ProcessQueueDelay, Timeout.Infinite);

private void TimerMethod(Object state)
        {
              ............
               _timerDB.Change(_ProcessQueueDelay, Timeout.Infinite);
        }



Ну допустим, этот метод появился только с 3.5 версии. :-) А во-вторых, каждый раз менять время? Проще Thread.Sleep.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760310
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallaris,

Ну и, если уж совсем заморочиться, то этот метод только у Threading.Timer. А в Windows.Timer и Timers.Timer такого метода нет, я только что проверил.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760320
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79А в Windows.Timer и Timers.Timer такого метода нет, я только что проверил.

Это не кошерные таймеры :)
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760336
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to all
Ну а чем массив таймеров не устраивает, есть ли какие ограничения на количество таймеров в системе? спасибо
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760345
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиНу а чем массив таймеров не устраиваетСвеном запретил + топикстартер не ищет лёгких путей.
Где-то в степиесть ли какие ограничения на количество таймеров в системе?Смотря каких.
Где-то в степиспасибоПожалуйста!
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760350
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиto all
Ну а чем массив таймеров не устраивает, есть ли какие ограничения на количество таймеров в системе? спасибо

Массив таймеров Windows.Timer - это жесть. Она работают, если мне память не изменяет, в основном потоке, поэтому тупить будет сильно.

Про остальные не знаю, но думаю, что можно, но это неоптимально.

А про таймеры и особенности здесь: http://msdn.microsoft.com/en-us/magazine/cc164015.aspx
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760355
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Массив таймеров Windows.Timer - это жесть.Что мешает по срабатыванию такого таймера запускать операции асинхронно?
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760357
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,
я формовые таймеры вообще не рассматриваю, за ненадобностью, если не изменяет память в 98 были еще какие ограничения
на количество таймеров в системе, щас по моему нет ( пока пул для калбеков не треснет, и то получим перехлест по дискретности)
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760368
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КArm79Массив таймеров Windows.Timer - это жесть.Что мешает по срабатыванию такого таймера запускать операции асинхронно?
Ничего, я просто ответил на вопрос про массив таймеров. Если он один - вопросов к нему нет. Если их 100,200,300 штук, будут проблемы, даже если операции обработки запускать асинхронно.

Где-то в степия формовые таймеры вообще не рассматриваю, за ненадобностью
Откуда же я знаю, что вы рассматриваете :-) Вы просили про таймеры, я ответил. Winforms в массиве не можно, остальные можно.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760387
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Алексей Кпропущено...
Что мешает по срабатыванию такого таймера запускать операции асинхронно?
Ничего, я просто ответил на вопрос про массив таймеров. Если он один - вопросов к нему нет. Если их 100,200,300 штук, будут проблемы, даже если операции обработки запускать асинхронно.В WPF проблем не будет, при высокой скорости запуска асинхронной операции.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760395
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КArm79пропущено...

Ничего, я просто ответил на вопрос про массив таймеров. Если он один - вопросов к нему нет. Если их 100,200,300 штук, будут проблемы, даже если операции обработки запускать асинхронно.В WPF проблем не будет, при высокой скорости запуска асинхронной операции.
Это который DispatcherTimer? возможно, я WPF не знаю. Но речь шла о System.Windows.Timer, а не Syste.Windows.Threading.Timer
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760397
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Алексей Кпропущено...
В WPF проблем не будет, при высокой скорости запуска асинхронной операции.
Это который DispatcherTimer?Да.
Arm79Но речь шла о System.Windows.Timer, а не Syste.Windows.Threading.TimerОк.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760399
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

Кстати, Алексей, а вы не считаете, что костыль для UI-таймера, который запускает асинхронную обработку, сложнее, чем запустить отдельный поток обработки либо использовать нормальный таймер?
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760410
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,
управление ui таймерами идет через процедуру окна, имхо тут узкое место
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760414
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Алексей К,

Кстати, Алексей, а вы не считаете, что костыль для UI-таймера, который запускает асинхронную обработку, сложнее, чем запустить отдельный поток обработки либо использовать нормальный таймер?Моё мнение:

1. Тип таймера выбирается в зависимости от потребностей.
1.1 Нужна синхронизация с UI при старте операции: DispatcherTimer
1.2 Не нужна: System.Threading.Timer

2. Реализация через таймер удобнее и эффективнее реализации через отдельный поток + очередь + WaitHandle.Wait.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760430
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К1.1 Нужна синхронизация с UI при старте операции: DispatcherTimer
В случае асинхронных операций все равно нужна будет синхронизация доступа к UI. Да и, как правильно заметил Где-то в степи, там узкое место - окно. Я где-то здесь на форуме читал, что быстрее 60 раз в секунду форму не отрисовать из-за ограничений на количество сообщений в очереди. Таким образом, те же 60 таймеров при ежесекундном срабатывании будут давать значительную погрешность. Если относительно WPF это неправда, буду рад услышать экспертное мнение.
Алексей К2. Реализация через таймер удобнее и эффективнее реализации через отдельный поток + очередь + WaitHandle.Wait.
В вашем случае все равно от очереди не убежать, разве что действительно массив таймеров. Но скажу честно, мне такая версия не нравится.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760437
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К2. Реализация через таймер удобнее и эффективнее реализации через отдельный поток + очередь + WaitHandle.Wait.
нет особой разницы
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760442
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Алексей К1.1 Нужна синхронизация с UI при старте операции: DispatcherTimer
В случае асинхронных операций все равно нужна будет синхронизация доступа к UI.Я про синхронизацию при старте операции, а не при её выполнении/окончании.
Arm79Да и, как правильно заметил Где-то в степи, там узкое место - окно.В WPF создаётся один API-таймер для ближайшего таймера, привязанного к данному диспетчеру. См метод http://www.dotnetframework.org/default.aspx/DotNET/DotNET/8@0/untmp/WIN_WINDOWS/lh_tools_devdiv_wpf/Windows/wcp/Base/System/Windows/Threading/Dispatcher@cs/2/Dispatcher@cs]UpdateWin32TimerFromDispatcherThread . Поэтому количество таймеров погоды не делает.
Arm79Я где-то здесь на форуме читал, что быстрее 60 раз в секунду форму не отрисовать из-за ограничений на количество сообщений в очереди. Таким образом, те же 60 таймеров при ежесекундном срабатывании будут давать значительную погрешность. Если относительно WPF это неправда, буду рад услышать экспертное мнение.Сколько бывает событий MouseMove в секунду? И ничего...
Arm79Алексей К2. Реализация через таймер удобнее и эффективнее реализации через отдельный поток + очередь + WaitHandle.Wait.
В вашем случае все равно от очереди не убежать, разве что действительно массив таймеров. Но скажу честно, мне такая версия не нравится.Я не настаиваю. Моё мнение ничем не лучше и не хуже остальных мнений. :-)
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760445
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей К2. Реализация через таймер удобнее и эффективнее реализации через отдельный поток + очередь + WaitHandle.Wait.
нет особой разницыНа нет и суда нет. :-)
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760451
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79В вашем случае все равно от очереди не убежать.Предпочитаю использовать готовую очередь из ThreadPool или Dispatcher, в зависимости от используемого таймера, вместо того, чтобы писать очередь самому.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760452
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КСколько бывает событий MouseMove в секунду? И ничего...
А сколько? И разве вы не замечали, что при некоторой загрузке формы курсор двигается рвано?
Алексей КВ WPF создаётся один API-таймер для ближайшего таймера, привязанного к данному диспетчеру. См метод http://www.dotnetframework.org/default.aspx/DotNET/DotNET/8@0/untmp/WIN_WINDOWS/lh_tools_devdiv_wpf/Windows/wcp/Base/System/Windows/Threading/Dispatcher@cs/2/Dispatcher@cs]UpdateWin32TimerFromDispatcherThread . Поэтому количество таймеров погоды не делает.
Простите, но это разве не та же фигня, только вид сбоку? Какая разница, 100 таймеров с обработчиком раз в секунду, или один таймер срабатывающий 100 раз в секунду? И то, и другое - слишком высокая нагрузка для UI
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760465
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Алексей КСколько бывает событий MouseMove в секунду? И ничего...
А сколько? И разве вы не замечали, что при некоторой загрузке формы курсор двигается рвано?В нормально написанных приложениях - нет. :-)
Arm79Алексей КВ WPF создаётся один API-таймер для ближайшего таймера, привязанного к данному диспетчеру. См метод http://www.dotnetframework.org/default.aspx/DotNET/DotNET/8@0/untmp/WIN_WINDOWS/lh_tools_devdiv_wpf/Windows/wcp/Base/System/Windows/Threading/Dispatcher@cs/2/Dispatcher@cs]UpdateWin32TimerFromDispatcherThread . Поэтому количество таймеров погоды не делает.
Простите, но это разве не та же фигня, только вид сбоку? Какая разница, 100 таймеров с обработчиком раз в секунду, или один таймер срабатывающий 100 раз в секунду? И то, и другое - слишком высокая нагрузка для UIЗначит нужно отказываться от синхронизации с UI, если "нагрузка" на UI-поток окажется недопустимой. Я же не утверждаю, что DispatcherTimer - это единственный способ.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38760485
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не нравится таймер, можно вызвать ThreadPool.RegisterWaitForSingleObject самостоятельно. :-)
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38767168
Фотография Капюшон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я решил остановиться на примитивном решении: один выделенный поток каждые пять секунд просыпается и проверяет очередь.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38768085
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Капюшоня решил остановиться на примитивном решении: один выделенный поток каждые пять секунд просыпается и проверяет очередь.
+1
Самое верное решение.
Потоки надо использовать когда без них нельзя.
Есть такое понятие как бизнес степ - то есть шаг программы, когда она успевает сделать то, что нужно.
Компьютер за микросекунды проверит массив даже из 5 тысяч элементов, которые будут отвечать за свое устройство.
Выдаст команду. И дальше будет спать стандартными средствами - проснется, выберет, выдаст - и дальше.
Никаких заморочек с синхронизациями и созданием потоков и их завершением....
Разбаловались совсем на быстром железе.....
Сколько у вас максимум устройств? 85? Это не то, что будет узким местом по производительности....
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38768513
Фотография Капюшон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну да, я использовал принцип KISS (Keep It Simple, Stupid)
Но, если честно, мне больше всего понравилось решение cdtyjv с Monitor.Wait, оно красивое.

Устройств около 200, но команды рассылаются не на все устройства и не всегда...
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38768525
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Капюшон ,
Ну и правильно вы все выбрали. Предложенное мною решение применяется в системе, где надо с милисекундной точностью генерировать тысячи событий в секунду. Там это оправдано на 100%. Если в вашем случае подходит более простое решение, и оно не имеет очевидных недостатков по вашим требованиям - надо использовать его.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38768659
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvв системе, где надо с милисекундной точностью генерировать тысячи событий в секунду.
В системе, которая называется не Windows, следует уточнить.
так как Windows для милисекундной точности не предназначена и технически не может ее обеспечить.
:-)
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38768731
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129cdtyjvв системе, где надо с милисекундной точностью генерировать тысячи событий в секунду.
В системе, которая называется не Windows, следует уточнить.
так как Windows для милисекундной точности не предназначена и технически не может ее обеспечить.
:-)

Справедливости ради стоит отметить, что есть аппаратные таймеры событий с высокой точностью , которые поддерживаются Windows. Ну и есть Multimedia Timers , хотя эти уже 1ms точность не обеспечат.

Правда, уверен, что свеном не это имел ввиду.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38768753
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще заюзать Reactive Extension
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38768801
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129cdtyjvв системе, где надо с милисекундной точностью генерировать тысячи событий в секунду.
В системе, которая называется не Windows, следует уточнить.
так как Windows для милисекундной точности не предназначена и технически не может ее обеспечить.
:-)Не надо выдумывать. Stopwatch конкретно на моей машине выдает разрешение около 2000000, или 500 наносекунд. Вы в прошлом веке застряли.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38768824
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvНе надо выдумывать. Stopwatch конкретно на моей машине выдает разрешение около 2000000, или 500 наносекунд. Вы в прошлом веке застряли.
Но вы же не Soptwatch-ем управляете, а потоками? Квант времени на поток примерно 16 мс.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38768882
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Но вы же не Soptwatch-ем управляете, а потоками? Квант времени на поток примерно 16 мс.Вы путаете теплое с мягким. Мне по-барабану сколько времени планировщик выделяет времени _работающему_ потоку. Мне важно, как быстро один поток может разбудить другой. Напишите простой тест с Monitor.Wait/Pulse и посмотрите, сколько раз в секунду один и тот же поток может просыпаться. Вы будете приятно удивлены полученной цифрой, которая будет в разы больше, чем 1000/16=62.5.
...
Рейтинг: 0 / 0
Периодическая отправка команд на сетевые устройства
    #38768939
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvДалее вы усыпляете поток черeз Thread.Wait() на этот интервал
cdtyjvМне важно, как быстро один поток может разбудить другой
Это непринципиально. Я же не говорю, что любой Wait означает автоматическое переключение контекста. Но на загруженной среде вероятность такого переключения возрастает. И в общем случае гарантировать миллисекундные задержки с помощью одного потока нельзя.
...
Рейтинг: 0 / 0
61 сообщений из 61, показаны все 3 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Периодическая отправка команд на сетевые устройства
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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