Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/41: Рейтинг темы: голосов - 41, средняя оценка - 4.80
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247

Как сделать вторичный поток с постоянный жизненным циклом и управлением из главного потока

24.11.2019, 14:52. Показов 9243. Ответов 113
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется объект, который живёт в другом потоке и выполняет различные задачи по запросам или выполняет повторяющиеся задачи.

Более приземленное описание. Через протокол modbus RTU опрашиваются датчики. Датчиков 247 штук. Используются 3 команды, чтение регистров, запись регистров, чтение ID. Управление датчиками может быть ручное или автоматическое. При ручном режиме принимаем данные из главного потока и передаем на датчик, после ответа датчика передаем данные в главный поток для записи в usb устройство и отображение на экране. При автоматическом режиме управляем датчиками по заданному алгоритму и отсылаем ответы датчиков в главный поток для записи на usb устройство и отображения данных.

Вот не знаю как лучше реализовать это.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.11.2019, 14:52
Ответы с готовыми решениями:

Как усыплять дочерний поток реализуя управление элементами из главного потока методом Invoke
как управлять элементами из главного потока в дочернем? Если напишите методом Invoke, то объясните тогда - как заставять в определённых...

Как запустить вторичный поток
Доброго дня, Помогите разобраться что не так, как это победить: срабатывает исключение InvalidOperationException в строчке...

VC++6.0, как из порожденного потока прочитать переменную главного потока?
Visual C++ 6.0 SP5 Простое диалоговое окно, (MFC) созданное мастером среды VC По нажатию на кнопку создаю поражденный поток, в...

113
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
30.11.2019, 14:52  [ТС]
Студворк — интернет-сервис помощи студентам
Датчики моя разработка как и сборка линукс для тиона. Адрес от 1 до 247.
Опрашиваю с помощью libmodbus.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
30.11.2019, 15:12
Цитата Сообщение от Alex_Golubev Посмотреть сообщение
Датчики моя разработка
Хорошо. Какие у них еще есть параметры, кроме адреса?
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 минуту
Цитата Сообщение от Alex_Golubev Посмотреть сообщение
Чтение и запись две команды. Точно не помню чтение 0x4 запись 0x10. Полный стандарт модбус
Во-во, как раз то, о чём я и говорил. Одновременно с потоками начните ещё и с модбусом разбираться.
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  [ТС]
Цитата Сообщение от alexu_007 Посмотреть сообщение
раз опрашивала все датчики, пусть и 18 секунд
Это уже все сделал. Программу я уже тестовую написал. Она работает.
Мне сейчас нужно как то разнести ручной авто обновление. и оформить это все красиво.
0
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
01.12.2019, 07:54  [ТС]
insite2012, Может по простому передавать указатель на поток через конструктор в класс диалогового окна?
И когда надо останавливать вторичный поток.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
01.12.2019, 09:14
Цитата Сообщение от Alex_Golubev Посмотреть сообщение
Может по простому передавать указатель на поток через конструктор в класс диалогового окна?
Alex_Golubev, я не знаю, как у вас сейчас сделано, но на мой взгляд, вам сейчас надо реализовать в первую очередь класс для работы с датчиками. Он должен:
1. опрашивать один датчик;
2. опрашивать все датчики в цикле;
3. возвращать информацию об опрошенных датчиках посредством сигналов (и только так);
4. иметь свойство, определяющее его статус: остановлен (STOPPED), работает (RUNNING). Их можно оформить как вложенное перечисление, например;
5. также можно сделать и сигнал для отображения прогресса опроса каждого из датчиков (по желанию);

Пока абстрагируйтесь от интерфейса, напишите его в консоли, отладьте, а потом его уже можно применить где угодно.

Далее, что касается отображения данных/записи их на к-либо накопитель. На мой взгляд, таймер тут применить не получится (или это может привести к проблемам). Как я понимаю, время получения данных у вас не строго определено, так что вполне может возникнуть ситуация, когда в обработчике тика таймера вы не успеете обработать все, а произойдет еще один тик. Думаю, тут будет удобнее применить вариацию шаблона Поставщик-Потребитель. Так вы получите максимально возможную скорость обработки данных без лишних простоев.
0
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
01.12.2019, 09:47  [ТС]
Я об этом думал. Можно в класс добавить поток ?

Добавлено через 6 минут
А как можно добавить в класс бесконечный опрос датчиков ? Мне вот это не совсем понятно.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
01.12.2019, 09:58
Цитата Сообщение от Alex_Golubev Посмотреть сообщение
Можно в класс добавить поток ?
Зачем??? Вы поймите, не надо мешать мух с котлетами. Класс должен функционировать сам по себе, а уж в потоке или нет-не его дело. В этом и смысл, реализовали класс, проверили в консоли, к примеру, где потоки без надобности, а при его же применении в GUI уже засунули его в поток.
Цитата Сообщение от Alex_Golubev Посмотреть сообщение
как можно добавить в класс бесконечный опрос датчиков ? Мне вот это не совсем понятно.
Да как обычно, бесконечный (условно) цикл. Опрос через что происходит (что используется как оконечное устройство, в смысле железо). Эмулятор ком порта, еще что-то?
0
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
01.12.2019, 10:06  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
. Эмулятор ком порта, еще что-то
Используется физический RS485. По сути дела это и есть ком порт только с добавлением линии RTS.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
01.12.2019, 10:38
Цитата Сообщение от Alex_Golubev Посмотреть сообщение
Используется физический RS485. По сути дела это и есть ком порт только с добавлением линии RTS.
Вот, уже хорошо.
Тут можно сделать так:
1. Создаем класс, который абстрагирует в себе работу с физическим интерфейсом (открыть, закрыть, послать данные, считать данные). Это делается для удобства (возможно, в будущем тип интерфейса поменяется, и если сразу его абстрагировать, то потом весь код, его использующий переписывать не придется). Ну и вообще так удобнее, вся низкоуровневая работа с байтами скрыта об более высоких уровней.
2. Создаем класс уже для работы с датчиками (как я писал выше). В параметре конструктора он получает строку-имя устройства (имя порта). Внутри себя он создает, открывает и конфигурирует устройство, и через него работает с датчиками.
0
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
01.12.2019, 10:50  [ТС]
Все равно не понимаю как сделать бесконечный опрос. На опрос одного датчика уходит 70 мили секунд. Это если он сразу ответил. А может быть помеха. И придется опросить его 3 раза. А это уже 210 мили секунд. Что заметно уже.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
01.12.2019, 12:36
Цитата Сообщение от Alex_Golubev Посмотреть сообщение
Все равно не понимаю как сделать бесконечный опрос
Естественно в цикле. Как обычно. Вы сейчас не заморачивайтесь на счет потоков и прочего. Напишите логику в консоли, отладьте ее, а потом уже можно думать и над потоками и интерфейсом.
Вот примерный скелет, как я бы реализовал подобную задачу. Посмотрите, переделайте с учетом ваших требований, отладьте, чтобы она стабильно работала в консоли, а уже потом будете двигаться дальше.
Вложения
Тип файла: rar untitled1.rar (5.2 Кб, 5 просмотров)
0
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
01.12.2019, 16:24  [ТС]
Хочу понять логику. Класс IODevice используется только для открытия закрытия порта и настройки скорости четности временных задержек?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
01.12.2019, 16:34
Цитата Сообщение от Alex_Golubev Посмотреть сообщение
Класс IODevice используется только для открытия закрытия порта и настройки скорости четности временных задержек?
Открыть устройство, закрыть устройство, послать запрос, получить ответ. Это его главные функции. Что это за запрос, что за ответ и как его интерпретировать-не его дело. Это будет происходить уже выше по логике.
0
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
01.12.2019, 16:55  [ТС]
Вы под устройством понимаете только com-порт ? Отрыть закрыть могу порт.

Добавлено через 15 минут
Внешней датчик открыть закрыть не могу. Там прямой запрос данных или запись данных. Открыл com-порт ---> задал номер датчика ---> отправил команду чтение регистров указав адрес и длину---> получил ответ. Обработал.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
01.12.2019, 17:08
Цитата Сообщение от Alex_Golubev Посмотреть сообщение
Вы под устройством понимаете только com-порт ?
Именно так.
Цитата Сообщение от Alex_Golubev Посмотреть сообщение
Открыл com-порт ---> задал номер датчика ---> отправил команду чтение регистров указав адрес и длину---> получил ответ. Обработал.
Вооот. Вот эту логику и реализуйте в классе IODevice. Послали команду-> получили ответ->вернули его в класс чтения. Это я там для примера показал возврат строки, вы можете вернуть что-то свое, переделав метод.
0
2 / 2 / 2
Регистрация: 27.02.2016
Сообщений: 247
01.12.2019, 17:28  [ТС]
Хорошо. Буду делать. После покажу что сделал.

Добавлено через 10 минут
А SensorInfo для чего ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.12.2019, 17:28

Главный поток и вторичный
1. При нажатии на кнопку Start в новом потоке запускается server.AcceptTcpClient() (который возвращает обьект TcpClient соединенного...

Каким синтаксисом запускается вторичный поток?
Каким синтаксисом запускается вторичный поток?

Не получается с вторичного потока обратиться напрямую к объекту из главного потока
Добрый день. Проблема заключается в том что не могу в WPF с вторичного потока обратится на прямую к объекту из главного потока. WPF пока...

Многопоточность: вызвать метод главного потока из второстепенного потока
Здравствуйте. Эта тема всеми избита, знаю. Но у меня очень ограничено время, поэтому рискую и пишу вопрос тут: Пишу приложение...

UiThread, как вынести процесс из главного потока?
Я - новичок в Android. Нужно в этом куске кода реализовать многопоточность. Очистить главный поток от операций, связанных с соединением с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Скрипты 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 (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru