|
0 / 0 / 0
Регистрация: 29.04.2016
Сообщений: 9
|
||||||
Timer.Elapsed vs Thread.sleep vs Что-то еще? И управление потоками11.04.2019, 14:59. Показов 2662. Ответов 3
Метки нет (Все метки)
Доброго времени суток! Прошу помощи уважаемого сообщества.
Суть: пишу относительно небольшое приложение для получения информации с контроллера Siemens S400. Приложение должно с определенным интервалом времени "снимать" показания с разных датчиков. Для связи с контроллером использую библиотеку S7.Net, и тут главная загвоздка - библиотека не умеет использовать нескольких одновременных подключений. а значит опрос нужно проводить последовательно. Для понимания логики работы кратко опишу алгоритм одного из элементов: 1) С интервалом 1сек считываем показания с датчика наличия (D1), на входе в зону. 2) Как только получили true, останавливаем опрос текущего датчика, и начинаем считывать с периодом показания с двух других (D2 - датчик наличия на выходе, период опроса 1сек, D3 - текущее давление, период опроса 100мс). 3) Пока D2 не вернет true, значения с D3 собираем в массив, затем математика. 4) Запускаем весь цикл по новой. Изначально попробовал сделать на System.Timers.timer'ах: Кликните здесь для просмотра всего текста
И вроде все работает, за исключение Большого НО : из за Timer.AutoReset = true создается куча потоков, которые не получается убить Timer.stop(); Timer.Dispose(); как я тут только не пробовал... OutOfMemoryExeption В результате Timer.AutoReset поставил в false, и вызывал Timer.Start(). Плодов не принесло. Как правильно организовать подобную задачу на таймерах? Или создавать новые потоки каждый раз, потом Thread.Sleep(), а затем убивать их? Кстаи, Thread.CurrentThread.Abort() у меня почему-то тоже не получилось. Или использовать другое решение? Есть добрые люди которые смогут подсказать? ЗыСы: многопоточность для меня очень новое понятие.
0
|
||||||
| 11.04.2019, 14:59 | |
|
Ответы с готовыми решениями:
3
Thread.Sleep() или Timer. Что лучше использовать? Timer and elapsed time
|
|
|
|||||||||||||||||
| 12.04.2019, 00:29 | |||||||||||||||||
Сообщение было отмечено M03Gen как решение
РешениеПоэтому ваш OutOfMemoryExeption скорее всего не из-за потоков. Ищите причину в чем-то другом. В данном случае первым делом посмотрите профилировщик, из которого сразу будет видно откуда берется перерасход памяти. Во-вторых, создавать кучу таймеров - не самая лучшая идея. Это усложняет логику, и создает побочные эффекты, которые трудно контролировать. Лучше создайте один таймер с большой частотой обновления. Внутри обработчика проверяйте условия и выполняйте действия. Если нужно например выполнить какое-то действие через 1 секунду, создайте в вашем классе поле
1
|
|||||||||||||||||
|
0 / 0 / 0
Регистрация: 29.04.2016
Сообщений: 9
|
||
| 12.04.2019, 07:51 [ТС] | ||
|
Предложенный Вами метод не плох. в какой-то мере я его и использовал в своем решении. Но что делать если необходимых сигналов не 3, а 1500? Описанная мной выше задача - всего лишь очень упрощенный пример, просто добавим к тем 4 действиям еще штук 5 для обработки новой логики. Причем новые действия должны происходить "параллельно" предыдущим 4. В принципе, реализовать это так как Вы подсказали можно, но прогр алгоритм полагаю превратится в сплошное месиво из условий. Может можно реализовать Nое количество таймеров под каждую логическую последовательность и задействовать их параллельно друг с другом? Но тогда как их работу между собой синхронизировать? Или может быть есть и другие варианты реализации подобной задачи?
0
|
||
|
|
||||||||||
| 12.04.2019, 09:03 | ||||||||||
Другое дело - как это сделать, чисто технически. В любом случае, непонятно как вам помогут 100500 таймеров. Вот где начнется каша... if(DateTime.Now > TimeToRead), а сделайте упорядоченную очередь задач. Каждая задача будет иметь свое время срабатывания, а таймер будет периодически брать из очереди задачу, проверять наступило ли ее время и исполнять, если нужно. На самом деле можно придумать множество реализаций, тут проблемы нет.Если не сможете реализовать самостоятельно, приведите более подробно условие задачи (приведите хотя бы два примере работы и опишите логику, подробно!!), могу написать простой пример реализации очереди.
1
|
||||||||||
| 12.04.2019, 09:03 | |
|
Помогаю со студенческими работами здесь
4
Timer - сколько времени осталось до Elapsed Отсутствует событие Elapsed компонента Timer Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|