|
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
|
|
Как сделать вторичный поток с постоянный жизненным циклом и управлением из главного потока24.11.2019, 14:52. Показов 9243. Ответов 113
Метки нет (Все метки)
Имеется объект, который живёт в другом потоке и выполняет различные задачи по запросам или выполняет повторяющиеся задачи.
Более приземленное описание. Через протокол modbus RTU опрашиваются датчики. Датчиков 247 штук. Используются 3 команды, чтение регистров, запись регистров, чтение ID. Управление датчиками может быть ручное или автоматическое. При ручном режиме принимаем данные из главного потока и передаем на датчик, после ответа датчика передаем данные в главный поток для записи в usb устройство и отображение на экране. При автоматическом режиме управляем датчиками по заданному алгоритму и отсылаем ответы датчиков в главный поток для записи на usb устройство и отображения данных. Вот не знаю как лучше реализовать это.
0
|
|
| 24.11.2019, 14:52 | |
|
Ответы с готовыми решениями:
113
Как усыплять дочерний поток реализуя управление элементами из главного потока методом Invoke Как запустить вторичный поток VC++6.0, как из порожденного потока прочитать переменную главного потока? |
|
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
|
|
| 30.11.2019, 14:52 [ТС] | |
|
Датчики моя разработка как и сборка линукс для тиона. Адрес от 1 до 247.
Опрашиваю с помощью libmodbus.
0
|
|
|
|
|
| 30.11.2019, 15:12 | |
|
0
|
|
|
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
|
|
| 30.11.2019, 15:26 [ТС] | |
|
Чтение и запись две команды. Точно не помню чтение 0x4 запись 0x10. Полный стандарт модбус
Добавлено через 4 минуты Использую в qt #include <modbus/modbus.h> подключил в buildroot.
0
|
|
|
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,348
|
||
| 30.11.2019, 15:48 | ||
|
Не понимаю, зачем вам отдельный поток в принципе. Обычная программа, нажимаем кнопку "авто" - запускается либо таймер, либо бесконечный цикл - опрашивающий датчики. В цикле стоит проверка флага, если он "авто" цикл выполняется, если "ручная" - цикл останавливается. По нажатию авто флаг включается. По нажатию ручная сбрасывается. Ну и ессно после остановки цикла можно выполнять любые действия.
А вот сброс в файл как раз можно выполнить в отдельном потоке. Я бы сперва сделал, что-бы по нажатию кнопки происходил однократный опрос датчиков - с записью в буфер, и возможно в файл. Затем поставил бы это дело в цикл. а потом можно допиливать и ручной режим - что там нужно, я не знаю, доступ к любому произвольному датчику, чтение, запись, или ещё что? А вы всё валите в кучу: авто режим, ручной, потоки... так никогда работающую программу не напишешь. Или вас троллят с помощью 247-ми датчиков! Добавлено через 1 минуту
0
|
||
|
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
|
|
| 30.11.2019, 16:37 [ТС] | |
|
Если не пользоваться потоками то будут тормаза в главном потоки. На опрос одного датчика уходит время. Если точно скорость 4800, 11 бит, одна посылка 32 байта. Вот и получается что одна посылка занимает 73 мС. приставляете 73 *247 = 18 секунд и это при условии что нет сбоев на шине. А если помехи ? То сами понимаете очень долго. Таймер тоже в главном потоки крутиться.
0
|
|
|
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,348
|
|
| 30.11.2019, 17:07 | |
|
Да какая разница. Сперва нужно сделать, что-бы по нажатию кнопки один раз опрашивала все датчики, пусть и 18 секунд. А потом уже думать, как всё это в поток запихнуть. Она ж не может одновременно и в ручном и в автоматическом режиме работать, поэтому всё равно либо ждать, пока все датчики не отработают, либо прерывать посередине, что, думаю, не айс.
0
|
|
|
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
|
||
| 30.11.2019, 17:10 [ТС] | ||
|
Мне сейчас нужно как то разнести ручной авто обновление. и оформить это все красиво.
0
|
||
|
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
|
|
| 01.12.2019, 07:54 [ТС] | |
|
insite2012, Может по простому передавать указатель на поток через конструктор в класс диалогового окна?
И когда надо останавливать вторичный поток.
0
|
|
|
|
||
| 01.12.2019, 09:14 | ||
|
1. опрашивать один датчик; 2. опрашивать все датчики в цикле; 3. возвращать информацию об опрошенных датчиках посредством сигналов (и только так); 4. иметь свойство, определяющее его статус: остановлен (STOPPED), работает (RUNNING). Их можно оформить как вложенное перечисление, например; 5. также можно сделать и сигнал для отображения прогресса опроса каждого из датчиков (по желанию); Пока абстрагируйтесь от интерфейса, напишите его в консоли, отладьте, а потом его уже можно применить где угодно. Далее, что касается отображения данных/записи их на к-либо накопитель. На мой взгляд, таймер тут применить не получится (или это может привести к проблемам). Как я понимаю, время получения данных у вас не строго определено, так что вполне может возникнуть ситуация, когда в обработчике тика таймера вы не успеете обработать все, а произойдет еще один тик. Думаю, тут будет удобнее применить вариацию шаблона Поставщик-Потребитель. Так вы получите максимально возможную скорость обработки данных без лишних простоев.
0
|
||
|
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
|
|
| 01.12.2019, 09:47 [ТС] | |
|
Я об этом думал. Можно в класс добавить поток ?
Добавлено через 6 минут А как можно добавить в класс бесконечный опрос датчиков ? Мне вот это не совсем понятно.
0
|
|
|
|
|||
| 01.12.2019, 09:58 | |||
|
0
|
|||
|
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
|
||
| 01.12.2019, 10:06 [ТС] | ||
|
0
|
||
|
|
||
| 01.12.2019, 10:38 | ||
|
Тут можно сделать так: 1. Создаем класс, который абстрагирует в себе работу с физическим интерфейсом (открыть, закрыть, послать данные, считать данные). Это делается для удобства (возможно, в будущем тип интерфейса поменяется, и если сразу его абстрагировать, то потом весь код, его использующий переписывать не придется). Ну и вообще так удобнее, вся низкоуровневая работа с байтами скрыта об более высоких уровней. 2. Создаем класс уже для работы с датчиками (как я писал выше). В параметре конструктора он получает строку-имя устройства (имя порта). Внутри себя он создает, открывает и конфигурирует устройство, и через него работает с датчиками.
0
|
||
|
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
|
|
| 01.12.2019, 10:50 [ТС] | |
|
Все равно не понимаю как сделать бесконечный опрос. На опрос одного датчика уходит 70 мили секунд. Это если он сразу ответил. А может быть помеха. И придется опросить его 3 раза. А это уже 210 мили секунд. Что заметно уже.
0
|
|
|
|
||
| 01.12.2019, 12:36 | ||
|
Вот примерный скелет, как я бы реализовал подобную задачу. Посмотрите, переделайте с учетом ваших требований, отладьте, чтобы она стабильно работала в консоли, а уже потом будете двигаться дальше.
0
|
||
|
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
|
|
| 01.12.2019, 16:24 [ТС] | |
|
Хочу понять логику. Класс IODevice используется только для открытия закрытия порта и настройки скорости четности временных задержек?
0
|
|
|
|
||
| 01.12.2019, 16:34 | ||
|
0
|
||
|
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
|
|
| 01.12.2019, 16:55 [ТС] | |
|
Вы под устройством понимаете только com-порт ? Отрыть закрыть могу порт.
Добавлено через 15 минут Внешней датчик открыть закрыть не могу. Там прямой запрос данных или запись данных. Открыл com-порт ---> задал номер датчика ---> отправил команду чтение регистров указав адрес и длину---> получил ответ. Обработал.
0
|
|
|
|
|||
| 01.12.2019, 17:08 | |||
|
0
|
|||
|
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
|
|
| 01.12.2019, 17:28 [ТС] | |
|
Хорошо. Буду делать. После покажу что сделал.
![]() Добавлено через 10 минут А SensorInfo для чего ?
0
|
|
| 01.12.2019, 17:28 | |
|
Не получается с вторичного потока обратиться напрямую к объекту из главного потока Многопоточность: вызвать метод главного потока из второстепенного потока UiThread, как вынести процесс из главного потока? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|