|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#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 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Алексей К100 потоков - это уже 100 МБ. Много это или мало? Осталось только увидеть в совете свенома где же эти 100 потоков? Лично я понял так, что поток был заведен только для того, чтобы не лочить UI. Поэтому он и один. Иногда и я так делаю, бывает проще чем с таймером. Не всегда, но бывает. Например, когда нужно не с каким то интервалом что-то дергать, а выдерживать интервал между окончанием обработки одной итерации и началом работы другой. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 10:43 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Arm79Алексей К100 потоков - это уже 100 МБ. Много это или мало? Иногда и я так делаю, бывает проще чем с таймером. Не всегда, но бывает. Например, когда нужно не с каким то интервалом что-то дергать, а выдерживать интервал между окончанием обработки одной итерации и началом работы другой. Так с таймером жеж то же самое Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 10:49 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
PallarisArm79пропущено... Иногда и я так делаю, бывает проще чем с таймером. Не всегда, но бывает. Например, когда нужно не с каким то интервалом что-то дергать, а выдерживать интервал между окончанием обработки одной итерации и началом работы другой. Так с таймером жеж то же самое Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Ну допустим, этот метод появился только с 3.5 версии. :-) А во-вторых, каждый раз менять время? Проще Thread.Sleep. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 10:54 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Pallaris, Ну и, если уж совсем заморочиться, то этот метод только у Threading.Timer. А в Windows.Timer и Timers.Timer такого метода нет, я только что проверил. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 10:57 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Arm79А в Windows.Timer и Timers.Timer такого метода нет, я только что проверил. Это не кошерные таймеры :) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 11:01 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
to all Ну а чем массив таймеров не устраивает, есть ли какие ограничения на количество таймеров в системе? спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 11:09 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Где-то в степиНу а чем массив таймеров не устраиваетСвеном запретил + топикстартер не ищет лёгких путей. Где-то в степиесть ли какие ограничения на количество таймеров в системе?Смотря каких. Где-то в степиспасибоПожалуйста! ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 11:15 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Где-то в степиto all Ну а чем массив таймеров не устраивает, есть ли какие ограничения на количество таймеров в системе? спасибо Массив таймеров Windows.Timer - это жесть. Она работают, если мне память не изменяет, в основном потоке, поэтому тупить будет сильно. Про остальные не знаю, но думаю, что можно, но это неоптимально. А про таймеры и особенности здесь: http://msdn.microsoft.com/en-us/magazine/cc164015.aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 11:18 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Arm79Массив таймеров Windows.Timer - это жесть.Что мешает по срабатыванию такого таймера запускать операции асинхронно? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 11:22 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Arm79, я формовые таймеры вообще не рассматриваю, за ненадобностью, если не изменяет память в 98 были еще какие ограничения на количество таймеров в системе, щас по моему нет ( пока пул для калбеков не треснет, и то получим перехлест по дискретности) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 11:23 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Алексей КArm79Массив таймеров Windows.Timer - это жесть.Что мешает по срабатыванию такого таймера запускать операции асинхронно? Ничего, я просто ответил на вопрос про массив таймеров. Если он один - вопросов к нему нет. Если их 100,200,300 штук, будут проблемы, даже если операции обработки запускать асинхронно. Где-то в степия формовые таймеры вообще не рассматриваю, за ненадобностью Откуда же я знаю, что вы рассматриваете :-) Вы просили про таймеры, я ответил. Winforms в массиве не можно, остальные можно. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 11:29 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Arm79Алексей Кпропущено... Что мешает по срабатыванию такого таймера запускать операции асинхронно? Ничего, я просто ответил на вопрос про массив таймеров. Если он один - вопросов к нему нет. Если их 100,200,300 штук, будут проблемы, даже если операции обработки запускать асинхронно.В WPF проблем не будет, при высокой скорости запуска асинхронной операции. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 11:40 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Алексей КArm79пропущено... Ничего, я просто ответил на вопрос про массив таймеров. Если он один - вопросов к нему нет. Если их 100,200,300 штук, будут проблемы, даже если операции обработки запускать асинхронно.В WPF проблем не будет, при высокой скорости запуска асинхронной операции. Это который DispatcherTimer? возможно, я WPF не знаю. Но речь шла о System.Windows.Timer, а не Syste.Windows.Threading.Timer ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 11:44 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Arm79Алексей Кпропущено... В WPF проблем не будет, при высокой скорости запуска асинхронной операции. Это который DispatcherTimer?Да. Arm79Но речь шла о System.Windows.Timer, а не Syste.Windows.Threading.TimerОк. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 11:47 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Алексей К, Кстати, Алексей, а вы не считаете, что костыль для UI-таймера, который запускает асинхронную обработку, сложнее, чем запустить отдельный поток обработки либо использовать нормальный таймер? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 11:48 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Arm79, управление ui таймерами идет через процедуру окна, имхо тут узкое место ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 11:54 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Arm79Алексей К, Кстати, Алексей, а вы не считаете, что костыль для UI-таймера, который запускает асинхронную обработку, сложнее, чем запустить отдельный поток обработки либо использовать нормальный таймер?Моё мнение: 1. Тип таймера выбирается в зависимости от потребностей. 1.1 Нужна синхронизация с UI при старте операции: DispatcherTimer 1.2 Не нужна: System.Threading.Timer 2. Реализация через таймер удобнее и эффективнее реализации через отдельный поток + очередь + WaitHandle.Wait. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 11:59 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Алексей К1.1 Нужна синхронизация с UI при старте операции: DispatcherTimer В случае асинхронных операций все равно нужна будет синхронизация доступа к UI. Да и, как правильно заметил Где-то в степи, там узкое место - окно. Я где-то здесь на форуме читал, что быстрее 60 раз в секунду форму не отрисовать из-за ограничений на количество сообщений в очереди. Таким образом, те же 60 таймеров при ежесекундном срабатывании будут давать значительную погрешность. Если относительно WPF это неправда, буду рад услышать экспертное мнение. Алексей К2. Реализация через таймер удобнее и эффективнее реализации через отдельный поток + очередь + WaitHandle.Wait. В вашем случае все равно от очереди не убежать, разве что действительно массив таймеров. Но скажу честно, мне такая версия не нравится. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 12:10 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Алексей К2. Реализация через таймер удобнее и эффективнее реализации через отдельный поток + очередь + WaitHandle.Wait. нет особой разницы ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 12:16 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
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. В вашем случае все равно от очереди не убежать, разве что действительно массив таймеров. Но скажу честно, мне такая версия не нравится.Я не настаиваю. Моё мнение ничем не лучше и не хуже остальных мнений. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 12:22 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
ИзопропилАлексей К2. Реализация через таймер удобнее и эффективнее реализации через отдельный поток + очередь + WaitHandle.Wait. нет особой разницыНа нет и суда нет. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 12:23 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Arm79В вашем случае все равно от очереди не убежать.Предпочитаю использовать готовую очередь из ThreadPool или Dispatcher, в зависимости от используемого таймера, вместо того, чтобы писать очередь самому. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 12:25 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Алексей КСколько бывает событий 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 12:26 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
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 - это единственный способ. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 12:32 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Не нравится таймер, можно вызвать ThreadPool.RegisterWaitForSingleObject самостоятельно. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2014, 12:40 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
я решил остановиться на примитивном решении: один выделенный поток каждые пять секунд просыпается и проверяет очередь. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2014, 12:34 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Капюшоня решил остановиться на примитивном решении: один выделенный поток каждые пять секунд просыпается и проверяет очередь. +1 Самое верное решение. Потоки надо использовать когда без них нельзя. Есть такое понятие как бизнес степ - то есть шаг программы, когда она успевает сделать то, что нужно. Компьютер за микросекунды проверит массив даже из 5 тысяч элементов, которые будут отвечать за свое устройство. Выдаст команду. И дальше будет спать стандартными средствами - проснется, выберет, выдаст - и дальше. Никаких заморочек с синхронизациями и созданием потоков и их завершением.... Разбаловались совсем на быстром железе..... Сколько у вас максимум устройств? 85? Это не то, что будет узким местом по производительности.... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2014, 16:00 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
ну да, я использовал принцип KISS (Keep It Simple, Stupid) Но, если честно, мне больше всего понравилось решение cdtyjv с Monitor.Wait, оно красивое. Устройств около 200, но команды рассылаются не на все устройства и не всегда... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2014, 22:38 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Капюшон , Ну и правильно вы все выбрали. Предложенное мною решение применяется в системе, где надо с милисекундной точностью генерировать тысячи событий в секунду. Там это оправдано на 100%. Если в вашем случае подходит более простое решение, и оно не имеет очевидных недостатков по вашим требованиям - надо использовать его. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2014, 22:52 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
cdtyjvв системе, где надо с милисекундной точностью генерировать тысячи событий в секунду. В системе, которая называется не Windows, следует уточнить. так как Windows для милисекундной точности не предназначена и технически не может ее обеспечить. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2014, 08:57 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
D129cdtyjvв системе, где надо с милисекундной точностью генерировать тысячи событий в секунду. В системе, которая называется не Windows, следует уточнить. так как Windows для милисекундной точности не предназначена и технически не может ее обеспечить. :-) Справедливости ради стоит отметить, что есть аппаратные таймеры событий с высокой точностью , которые поддерживаются Windows. Ну и есть Multimedia Timers , хотя эти уже 1ms точность не обеспечат. Правда, уверен, что свеном не это имел ввиду. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2014, 10:13 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Можно еще заюзать Reactive Extension ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2014, 10:33 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
D129cdtyjvв системе, где надо с милисекундной точностью генерировать тысячи событий в секунду. В системе, которая называется не Windows, следует уточнить. так как Windows для милисекундной точности не предназначена и технически не может ее обеспечить. :-)Не надо выдумывать. Stopwatch конкретно на моей машине выдает разрешение около 2000000, или 500 наносекунд. Вы в прошлом веке застряли. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2014, 11:16 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
cdtyjvНе надо выдумывать. Stopwatch конкретно на моей машине выдает разрешение около 2000000, или 500 наносекунд. Вы в прошлом веке застряли. Но вы же не Soptwatch-ем управляете, а потоками? Квант времени на поток примерно 16 мс. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2014, 11:34 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
Arm79Но вы же не Soptwatch-ем управляете, а потоками? Квант времени на поток примерно 16 мс.Вы путаете теплое с мягким. Мне по-барабану сколько времени планировщик выделяет времени _работающему_ потоку. Мне важно, как быстро один поток может разбудить другой. Напишите простой тест с Monitor.Wait/Pulse и посмотрите, сколько раз в секунду один и тот же поток может просыпаться. Вы будете приятно удивлены полученной цифрой, которая будет в разы больше, чем 1000/16=62.5. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2014, 12:05 |
|
Периодическая отправка команд на сетевые устройства
|
|||
---|---|---|---|
#18+
cdtyjvДалее вы усыпляете поток черeз Thread.Wait() на этот интервал cdtyjvМне важно, как быстро один поток может разбудить другой Это непринципиально. Я же не говорю, что любой Wait означает автоматическое переключение контекста. Но на загруженной среде вероятность такого переключения возрастает. И в общем случае гарантировать миллисекундные задержки с помощью одного потока нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2014, 12:38 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1402396]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
79ms |
get tp. blocked users: |
2ms |
others: | 315ms |
total: | 475ms |
0 / 0 |