Russian Qt Forum
Ноябрь 22, 2024, 22:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 ... 7   Вниз
  Печать  
Автор Тема: Работа из QSerialPort из разных потоков  (Прочитано 46836 раз)
Alechin
Гость
« : Март 23, 2017, 13:06 »

Задача такая. есть POS-принтер на COM порту. Необходимо иметь возможность передавать ему команды как из одного потока (основного) так и из дополнительного потока (фоновая печать).
QSerialPort создается и открывается в основном потоке. с вызовом функций write, waitForBytesWritten, wiatForReadyRead проблем нет - все работает (что логично).
Для фоновой печати записываю в очередь требуемые для передачи в принтер команды и вызываю метод фоновой печати через QtConcurrent::run. Соответственно тут все перестает работать - порт принадлежит другому потоку.
Как можно выкрутиться? или у меня что-то не так идеологически?
спасибо!
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Март 23, 2017, 13:13 »

Не так идеалогически. Используй асинхронную работу через сигналы/слоты. Ищи по форуму.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alechin
Гость
« Ответ #2 : Март 23, 2017, 13:44 »

я так понимаю неверна идеология реализации именно на Qt? потому как с точки зрения пользователя не вижу никакой ошибки в идеологии: готов ждать результата - выполняю в основном потоке. не хочу ждать результата - выполняю этот же самый код в другом потоке и потом смотрю результат. Код абсолютно линейный и "прозрачный".
через слоты и сигналы попытался сделать - получилось ну "очень много буков". Т.е. фоновую печать да - сделал. а как получить состояние в основном потоке когда мне нужно остановить выполнение до получения результата?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Март 23, 2017, 13:50 »

Не хочу ждать результата - это совершенно не означает, что нужен отдельный поток. Прочитай про асинхронное программирование.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #4 : Март 23, 2017, 15:02 »

слово serial как бы намекает, что порт последовательный
из 2+ потоков можно, но по очереди )
Записан
Alechin
Гость
« Ответ #5 : Март 23, 2017, 15:37 »

не получается из двух потоков. если вызывать не из потока в котором порт был создан - не работают функции wait_  выскакивает сообщение о несовпадении потоков.
да - с асинхронным многопоточным программированием под Win на Builder знаком в течение 15 лет каждый рабочий день.
а вот перенести приемы потоков win на Qt не получилось Грустный
(по мне яснее и прозрачнее WaitForMultipleObjects ничего нет, на Qt какая-то полная каша выходит)
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Март 23, 2017, 15:45 »

Асинхронность и WaitFor* это взаимоисключающие вещи. Читай про сигнал readyRead.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alechin
Гость
« Ответ #7 : Март 23, 2017, 15:46 »

и как он поможет мне заблокировать основной поток на ожидании ответ?
Записан
Alechin
Гость
« Ответ #8 : Март 23, 2017, 15:53 »

хочу сказать что вариант с портом в отдельном потоке и слот-сигнальной реализацией я реализовал в первую очередь. получился "страшный тормозной монстр".
например: передать два байта в порт в другом потоке напрямую я не могу, так как port->write "ругается". приходится формировать сигнал в поток порта, который QueuedConnection, и посему передача этих байт происходит не сразу, а где-то через 15-20 мсек. При этом мне надо иметь 2 события, на одном делаю wait в ожидании начала передачи, на другом я делаю wait для ожидания завершения передачи. И это только для того чтобы передать 2 байта и дождаться завершения их передачи. Чтобы подождать ответа снова заводим событие, на котором делаем wait, а событие взводится в вашем readyRead.
а всего-то надо передать 2 байта и получить в ответ 1.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Март 23, 2017, 15:55 »

и как он поможет мне заблокировать основной поток на ожидании ответ?
Его не надо блокировать!
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #10 : Март 23, 2017, 16:07 »

Я даж комментировать не буду, и даже не зовите меня в тред. Улыбающийся

Записан

ArchLinux x86_64 / Win10 64 bit
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #11 : Март 23, 2017, 16:15 »

Я даж комментировать не буду, и даже не зовите меня в тред. Улыбающийся
Сам пришел, сам напросился. Не хочешь разве для человека поискать ответов по форуму?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #12 : Март 23, 2017, 16:51 »

При этом мне надо иметь 2 события, на одном делаю wait в ожидании начала передачи, на другом я делаю wait для ожидания завершения передачи.

а зачем ?
плюнул в порт и ладно
пришли данные - событие
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #13 : Март 23, 2017, 17:14 »

Цитировать
Не хочешь разве для человека поискать ответов по форуму?

Не, раз у человека 15-лет стажу в борланде - то он сам разберется (пущай сам ищет ответы.. оно уже обсуждалось много раз).
Записан

ArchLinux x86_64 / Win10 64 bit
Alechin
Гость
« Ответ #14 : Март 23, 2017, 18:49 »

Хорошо, если мне надо пять раз плюнуть в порт получив ответ и по каждому ответу решить что и куда плевать дальше? Вполне себе линейная логика. как ее вписать в "асинхронную модель"? притянуть ее за уши? если то что плевать дальше зависит от ответа на предыдущий плевок?
зачем тут вообще асинхронная модель? почему я не могу вызвать из одного потока процедуру другого потока? что это вообще за дурь такая? почему запись в порт может осуществляется только из одного конкретного потока?
я просто не понимаю логики. не все равно из какого потока запись port->write()?
Записан
Страниц: [1] 2 3 ... 7   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 23.