Russian Qt Forum
Май 07, 2024, 07:19
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
Работа из QSerialPort из разных потоков
Страниц:
1
2
3
[
4
]
5
6
7
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Работа из QSerialPort из разных потоков (Прочитано 43675 раз)
Alechin
Гость
Re: Работа из QSerialPort из разных потоков
«
Ответ #45 :
Март 24, 2017, 09:47 »
Цитата: Пантер от Март 24, 2017, 09:40
> У меня только прохождение Ququed сигнала начала передачи заняло 20 мсек!
Что за прохождение? Чем замерял? Вызов слота при выдаче сигнала в однопоточном окружении не несет практически никаких накладных расходов (если используется Qt::AutoConnection)
использовать Qt::AutoConnection не получается - потоки разные. Только Queued.
а замерял просто qDebug()<<Time().currentTime()
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Работа из QSerialPort из разных потоков
«
Ответ #46 :
Март 24, 2017, 09:49 »
Цитата: sergek от Март 24, 2017, 09:41
Цитата: Пантер от Март 24, 2017, 09:23
У меня сейчас сервис на Qt работает по сокетам с автомобильными трекерами, одновременно бывает подключено около 10К трекеров. Вся работа проводится в констексте одного потока и никакой просадки по производительности нет.
Этот сервис использует DeviceCommunicator?
Идея этого класса хорошая, спасибо за науку
Нет, там более сложная архитектура. А это просто наколенный пример.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Работа из QSerialPort из разных потоков
«
Ответ #47 :
Март 24, 2017, 09:50 »
Цитата: Alechin от Март 24, 2017, 09:37
передача в порт 2-ух байтов "напрямую" с ожиданием их выдачи и получением ответа занимает 300 мксек. У меня
только прохождение Ququed сигнала начала передачи заняло 20 мсек! т.е. в 66 раз больше!
20 миллисекунд? Т.е. я смогу в секунду послать не более 50 сигналов queued? Такой рез-т - явный абсурд. Когда-то сам мерял - все там норм, не выдумывайте
Цитата: Alechin от Март 24, 2017, 09:37
да, получается такое вот упрощение и повышения наглядности ПО.
Ну "преждевременной оптимизации" никто не отменял. Если хотите печатать из разных потоков - придется пойти на какие-то накладные расходы, и использование слот/сигналов - вариант очень приличный
Цитата: Igors от Март 24, 2017, 09:26
почему вы все считаете что кто-то одновременно полезет? есть класс работы с принтеров. класс одни. все обращения к принтеру только через него. он сам разруливает кого пустить к принтеру а кого нет.
Ну и сосредоточьте всю работу с принтером в одном потоке, типа "всегда фоновый". Главный или какой-то другой поток захотел печатать - общается с "печатающим" через QueuedConnection
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Работа из QSerialPort из разных потоков
«
Ответ #48 :
Март 24, 2017, 09:50 »
Цитата: Alechin от Март 24, 2017, 09:47
Цитата: Пантер от Март 24, 2017, 09:40
> У меня только прохождение Ququed сигнала начала передачи заняло 20 мсек!
Что за прохождение? Чем замерял? Вызов слота при выдаче сигнала в однопоточном окружении не несет практически никаких накладных расходов (если используется Qt::AutoConnection)
использовать Qt::AutoConnection не получается - потоки разные. Только Queued.
а замерял просто qDebug()<<Time().currentTime()
Вот как раз из-за того, что потоки разные. Если делать один поток, то никакой просадки нет - делается прямой вызов.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alechin
Гость
Re: Работа из QSerialPort из разных потоков
«
Ответ #49 :
Март 24, 2017, 09:51 »
Цитата: Пантер от Март 24, 2017, 09:50
Цитата: Alechin от Март 24, 2017, 09:47
Цитата: Пантер от Март 24, 2017, 09:40
> У меня только прохождение Ququed сигнала начала передачи заняло 20 мсек!
Что за прохождение? Чем замерял? Вызов слота при выдаче сигнала в однопоточном окружении не несет практически никаких накладных расходов (если используется Qt::AutoConnection)
использовать Qt::AutoConnection не получается - потоки разные. Только Queued.
а замерял просто qDebug()<<Time().currentTime()
Вот как раз из-за того, что потоки разные. Если делать один поток, то никакой просадки нет - делается прямой вызов.
уточню: делать"не один поток" а делать все основном GUI потоке?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Работа из QSerialPort из разных потоков
«
Ответ #50 :
Март 24, 2017, 09:53 »
Цитата: Пантер от Март 24, 2017, 09:50
Вот как раз из-за того, что потоки разные. Если делать один поток, то никакой просадки нет - делается прямой вызов.
Та хоть и разные - до 20 миллисекунд там "дистанция огромного размера"
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Работа из QSerialPort из разных потоков
«
Ответ #51 :
Март 24, 2017, 09:55 »
Цитата: Igors от Март 24, 2017, 09:53
Цитата: Пантер от Март 24, 2017, 09:50
Вот как раз из-за того, что потоки разные. Если делать один поток, то никакой просадки нет - делается прямой вызов.
Та хоть и разные - до 20 миллисекунд там "дистанция огромного размера"
Если были какие-то действия и ивентлуп не прокручивался, то хоть час может пройти.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Работа из QSerialPort из разных потоков
«
Ответ #52 :
Март 24, 2017, 09:56 »
> уточню: делать"не один поток" а делать все основном GUI потоке?
Делать все в контексте основного потока до тех пор, пока не столкнешься с проблемой в производительности и не докажешь, что эта проблема именно из-за однопоточности.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alechin
Гость
Re: Работа из QSerialPort из разных потоков
«
Ответ #53 :
Март 24, 2017, 09:56 »
Цитата: Igors от Март 24, 2017, 09:50
20 миллисекунд? Т.е. я смогу в секунду послать не более 50 сигналов queued? Такой рез-т - явный абсурд. Когда-то сам мерял - все там норм, не выдумывайте
да, qDebug()<<QTime показыват именно такие цифры. Я так понимаю это очень похоже квант времени потока.
Цитата: Igors от Март 24, 2017, 09:26
Ну и сосредоточьте всю работу с принтером в одном потоке, типа "всегда фоновый". Главный или какой-то другой поток захотел печатать - общается с "печатающим" через QueuedConnection
да уже так и сделано. Все работает. Удивила монструозность и тормознутость решения. Плюс непрозрачность (при взгляде со стороны), например дерганье своего собственного сигнала что бы вызвать свой собственный слот только потому что обычный port->write (по сути обычная запись файла!) не работает из чужого потока.
потому и возник вопрос "все ли я делаю так".
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Работа из QSerialPort из разных потоков
«
Ответ #54 :
Март 24, 2017, 09:58 »
Цитата: Alechin от Март 24, 2017, 09:56
Цитата: Igors от Март 24, 2017, 09:50
20 миллисекунд? Т.е. я смогу в секунду послать не более 50 сигналов queued? Такой рез-т - явный абсурд. Когда-то сам мерял - все там норм, не выдумывайте
да, qDebug()<<QTime показыват именно такие цифры. Я так понимаю это очень похоже квант времени потока.
Цитата: Igors от Март 24, 2017, 09:26
Ну и сосредоточьте всю работу с принтером в одном потоке, типа "всегда фоновый". Главный или какой-то другой поток захотел печатать - общается с "печатающим" через QueuedConnection
да уже так и сделано. Все работает. Удивила монструозность и тормознутость решения. Плюс непрозрачность (при взгляде со стороны), например дерганье своего собственного сигнала что бы вызвать свой собственный слот только потому что обычный port->write (по сути обычная запись файла!) не работает из чужого потока.
потому и возник вопрос "все ли я делаю так".
Нет, ты делаешь не так.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Работа из QSerialPort из разных потоков
«
Ответ #55 :
Март 24, 2017, 10:02 »
Цитата: Alechin от Март 24, 2017, 09:56
да уже так и сделано. Все работает. Удивила монструозность и тормознутость решения. Плюс непрозрачность (при взгляде со стороны), например дерганье своего собственного сигнала что бы вызвать свой собственный слот только потому что обычный port->write (по сути обычная запись файла!) не работает из чужого потока.
потому и возник вопрос "все ли я делаю так".
Ну похоже что не так
Иначе не пришлось бы дергать свой же слот через queued
Записан
Alechin
Гость
Re: Работа из QSerialPort из разных потоков
«
Ответ #56 :
Март 24, 2017, 10:02 »
я уже понял что нет так
в смысле выноса в отдельный поток.
в таком случает (насчет предыдущего ответа с непрокручивание event_loop) - возникает боязнь что работоспособность системы будет зависеть от event-Loopа основного потока, что не есть хорошо. Работа в отдельном потоке не зависит от event_loopa других модулей программы. Виндовому WaitForMultipleEvent было все равно, даже если остальные потоки повисли - текущий всегда отрабатывал "мгновенно" свой функционал.
более того - для каждого потока (считай устройства, потому как работы с каждым устройством обычно шла в своем потоке) всегда отображалась статистика занятой памяти и времени работы потока, что позволяло легко отследить "взбесившиеся" устройства. Плюс для каждого потока отслеживалось что поток крутится, события приходят. если этого не происходило - поток автоматически перезапускался, в системный журнал делалась запись об этом..
В общем в выделении отдельного потока на каждое устройство были свои плюсы....
в принципе я все понял.......
«
Последнее редактирование: Март 24, 2017, 10:07 от Alechin
»
Записан
Alechin
Гость
Re: Работа из QSerialPort из разных потоков
«
Ответ #57 :
Март 24, 2017, 10:03 »
Цитата: Igors от Март 24, 2017, 10:02
Ну похоже что не так
Иначе не пришлось бы дергать свой же слот через queued
в подходе с отдельным поток все так.
запись в порт из соседнего потока НЕ РАБОТАЕТ для QSerialPort.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Работа из QSerialPort из разных потоков
«
Ответ #58 :
Март 24, 2017, 10:09 »
Цитата: Alechin от Март 24, 2017, 10:03
в подходе с отдельным поток все так.
запись в порт из соседнего потока НЕ РАБОТАЕТ для QSerialPort.
"И это правильно". Запускаете "принтерный" поток (он и только он юзает QSerialPort), и пуляете в него сигналами - это все. Не нужно никаких доп EveтtLoop и.т.п. Если у потока нет работы - он сам повиснет в своем событийном цикле. Ну и там флажков парочку накиньте - и все дела
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Работа из QSerialPort из разных потоков
«
Ответ #59 :
Март 24, 2017, 10:11 »
Цитата: Alechin от Март 24, 2017, 10:02
я уже понял что нет так
в смысле выноса в отдельный поток.
в таком случает (насчет предыдущего ответа с непрокручивание event_loop) - возникает боязнь что работоспособность системы будет зависеть от event-Loopа основного потока, что не есть хорошо. Работа в отдельном потоке не зависит от event_loopa других модулей программы. Виндовому WaitForMultipleEvent было все равно, даже если остальные потолки повисли - текущий всегда отрабатывал "мгновенно" свой функционал.
в принципе я все понял.......
В большинстве случаев, все будет хорошо. Мне в сервисе пришлось выносить в отдельный поток сохранение данных на диск, когда я столкнулся с просадкой по производительности, ибо дисковый IO тормозил основной поток. Я создал класс, у которого есть метод на прием данных файла и поместил его в отдельный поток. Получилось так: класс принимает данне для файла и помещает их в очередь (собственно, вызов метода не имеет просадки), а дальше по ивентлупу потока происходит реальная запись данных в файл. В итоге, основной поток разгрузился и все опять заработало как часы.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц:
1
2
3
[
4
]
5
6
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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...