Russian Qt Forum
Ноябрь 22, 2024, 16:15
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
Работа из QSerialPort из разных потоков
Страниц: [
1
]
2
3
...
7
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Работа из QSerialPort из разных потоков (Прочитано 46752 раз)
Alechin
Гость
Работа из QSerialPort из разных потоков
«
:
Март 23, 2017, 13:06 »
Задача такая. есть POS-принтер на COM порту. Необходимо иметь возможность передавать ему команды как из одного потока (основного) так и из дополнительного потока (фоновая печать).
QSerialPort создается и открывается в основном потоке. с вызовом функций write, waitForBytesWritten, wiatForReadyRead проблем нет - все работает (что логично).
Для фоновой печати записываю в очередь требуемые для передачи в принтер команды и вызываю метод фоновой печати через QtConcurrent::run. Соответственно тут все перестает работать - порт принадлежит другому потоку.
Как можно выкрутиться? или у меня что-то не так идеологически?
спасибо!
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Работа из QSerialPort из разных потоков
«
Ответ #1 :
Март 23, 2017, 13:13 »
Не так идеалогически. Используй асинхронную работу через сигналы/слоты. Ищи по форуму.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alechin
Гость
Re: Работа из QSerialPort из разных потоков
«
Ответ #2 :
Март 23, 2017, 13:44 »
я так понимаю неверна идеология реализации именно на Qt? потому как с точки зрения пользователя не вижу никакой ошибки в идеологии: готов ждать результата - выполняю в основном потоке. не хочу ждать результата - выполняю этот же самый код в другом потоке и потом смотрю результат. Код абсолютно линейный и "прозрачный".
через слоты и сигналы попытался сделать - получилось ну "очень много буков". Т.е. фоновую печать да - сделал. а как получить состояние в основном потоке когда мне нужно остановить выполнение до получения результата?
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Работа из QSerialPort из разных потоков
«
Ответ #3 :
Март 23, 2017, 13:50 »
Не хочу ждать результата - это совершенно не означает, что нужен отдельный поток. Прочитай про асинхронное программирование.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
qate
Супер
Offline
Сообщений: 1177
Re: Работа из QSerialPort из разных потоков
«
Ответ #4 :
Март 23, 2017, 15:02 »
слово serial как бы намекает, что порт последовательный
из 2+ потоков можно, но по очереди )
Записан
Alechin
Гость
Re: Работа из QSerialPort из разных потоков
«
Ответ #5 :
Март 23, 2017, 15:37 »
не получается из двух потоков. если вызывать не из потока в котором порт был создан - не работают функции wait_ выскакивает сообщение о несовпадении потоков.
да - с асинхронным многопоточным программированием под Win на Builder знаком в течение 15 лет каждый рабочий день.
а вот перенести приемы потоков win на Qt не получилось
(по мне яснее и прозрачнее WaitForMultipleObjects ничего нет, на Qt какая-то полная каша выходит)
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Работа из QSerialPort из разных потоков
«
Ответ #6 :
Март 23, 2017, 15:45 »
Асинхронность и WaitFor* это взаимоисключающие вещи. Читай про сигнал readyRead.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alechin
Гость
Re: Работа из QSerialPort из разных потоков
«
Ответ #7 :
Март 23, 2017, 15:46 »
и как он поможет мне заблокировать основной поток на ожидании ответ?
Записан
Alechin
Гость
Re: Работа из QSerialPort из разных потоков
«
Ответ #8 :
Март 23, 2017, 15:53 »
хочу сказать что вариант с портом в отдельном потоке и слот-сигнальной реализацией я реализовал в первую очередь. получился "страшный тормозной монстр".
например: передать два байта в порт в другом потоке напрямую я не могу, так как port->write "ругается". приходится формировать сигнал в поток порта, который QueuedConnection, и посему передача этих байт происходит не сразу, а где-то через 15-20 мсек. При этом мне надо иметь 2 события, на одном делаю wait в ожидании начала передачи, на другом я делаю wait для ожидания завершения передачи. И это только для того чтобы передать 2 байта и дождаться завершения их передачи. Чтобы подождать ответа снова заводим событие, на котором делаем wait, а событие взводится в вашем readyRead.
а всего-то надо передать 2 байта и получить в ответ 1.
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Работа из QSerialPort из разных потоков
«
Ответ #9 :
Март 23, 2017, 15:55 »
Цитата: Alechin от Март 23, 2017, 15:46
и как он поможет мне заблокировать основной поток на ожидании ответ?
Его не надо блокировать!
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Работа из QSerialPort из разных потоков
«
Ответ #10 :
Март 23, 2017, 16:07 »
Я даж комментировать не буду, и даже не зовите меня в тред.
Записан
ArchLinux x86_64 / Win10 64 bit
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Работа из QSerialPort из разных потоков
«
Ответ #11 :
Март 23, 2017, 16:15 »
Цитата: kuzulis от Март 23, 2017, 16:07
Я даж комментировать не буду, и даже не зовите меня в тред.
Сам пришел, сам напросился. Не хочешь разве для человека поискать ответов по форуму?
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
qate
Супер
Offline
Сообщений: 1177
Re: Работа из QSerialPort из разных потоков
«
Ответ #12 :
Март 23, 2017, 16:51 »
Цитата: Alechin от Март 23, 2017, 15:53
При этом мне надо иметь 2 события, на одном делаю wait в ожидании начала передачи, на другом я делаю wait для ожидания завершения передачи.
а зачем ?
плюнул в порт и ладно
пришли данные - событие
Записан
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Работа из QSerialPort из разных потоков
«
Ответ #13 :
Март 23, 2017, 17:14 »
Цитировать
Не хочешь разве для человека поискать ответов по форуму?
Не, раз у человека 15-лет стажу в борланде - то он сам разберется (пущай сам ищет ответы.. оно уже обсуждалось много раз).
Записан
ArchLinux x86_64 / Win10 64 bit
Alechin
Гость
Re: Работа из QSerialPort из разных потоков
«
Ответ #14 :
Март 23, 2017, 18:49 »
Хорошо, если мне надо пять раз плюнуть в порт получив ответ и по каждому ответу решить что и куда плевать дальше? Вполне себе линейная логика. как ее вписать в "асинхронную модель"? притянуть ее за уши? если то что плевать дальше зависит от ответа на предыдущий плевок?
зачем тут вообще асинхронная модель? почему я не могу вызвать из одного потока процедуру другого потока? что это вообще за дурь такая? почему запись в порт может осуществляется только из одного конкретного потока?
я просто не понимаю логики. не все равно из какого потока запись port->write()?
Записан
Страниц: [
1
]
2
3
...
7
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...