Russian Qt Forum
Май 03, 2024, 02:32
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
Работа из QSerialPort из разных потоков
Страниц:
1
...
3
4
[
5
]
6
7
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Работа из QSerialPort из разных потоков (Прочитано 43103 раз)
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Работа из QSerialPort из разных потоков
«
Ответ #60 :
Март 24, 2017, 10:12 »
Цитата: Igors от Март 24, 2017, 10:09
Цитата: Alechin от Март 24, 2017, 10:03
в подходе с отдельным поток все так.
запись в порт из соседнего потока НЕ РАБОТАЕТ для QSerialPort.
"И это правильно". Запускаете "принтерный" поток (он и только он юзает QSerialPort), и пуляете в него сигналами - это все. Не нужно никаких доп EveтtLoop и.т.п. Если у потока нет работы - он сам повиснет в своем событийном цикле. Ну и там флажков парочку накиньте - и все дела
Зачем отдельный поток? QSerialPort, как я понял, вполне себе заточен для работы в основном потоке, если использовать асинхронное общение.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Работа из QSerialPort из разных потоков
«
Ответ #61 :
Март 24, 2017, 10:13 »
Цитировать
запись в порт из соседнего потока НЕ РАБОТАЕТ для QSerialPort.
Удивительно, правда? А с чего бы оно должно работать?
А документацию мы читаем, или пытаемся с наскоку
наделать потоков (понатыкать везде WaitFor, ну да, не резиновая),
а потом плачемся что оно тормозит и крешится?
Хотим вот так шлеп-шлеп и в продакшен?
PS: Интересно, удивлю, если скажу, что в Qt все классы QIODevice
не позволяют так делать - дергать методы из разныз потоков
(да и вообще все классы QObject по большому счету)!
Записан
ArchLinux x86_64 / Win10 64 bit
Alechin
Гость
Re: Работа из QSerialPort из разных потоков
«
Ответ #62 :
Март 24, 2017, 10:14 »
Цитата: Igors от Март 24, 2017, 10:09
"И это правильно". Запускаете "принтерный" поток (он и только он юзает QSerialPort), и пуляете в него сигналами - это все. Не нужно никаких доп EveтtLoop и.т.п. Если у потока нет работы - он сам повиснет в своем событийном цикле.
а никакх event_loop и нет.
вот как выглядит метод передачи:
void POS_Printer::Reset(quint _type)
{
char req[3] = { 0x1b, 0x4a }; // ESC J
req[2] = _type;
port->write(req, 3); <---------- не работает при вызове Reset() из другого потока.
}
приходится заводить сигнал signal_Reset();
подключать его через Queued к слоту Reset();
и вместо Reset() делать emit signal_Reset()
т.е. дергать самого себя за яйца.
Записан
Alechin
Гость
Re: Работа из QSerialPort из разных потоков
«
Ответ #63 :
Март 24, 2017, 10:17 »
Цитата: Пантер от Март 24, 2017, 10:11
В большинстве случаев, все будет хорошо. Мне в сервисе пришлось выносить в отдельный поток сохранение данных на диск, когда я столкнулся с просадкой по производительности, ибо дисковый IO тормозил основной поток. Я создал класс, у которого есть метод на прием данных файла и поместил его в отдельный поток. Получилось так: класс принимает данне для файла и помещает их в очередь (собственно, вызов метода не имеет просадки), а дальше по ивентлупу потока происходит реальная запись данных в файл. В итоге, основной поток разгрузился и все опять заработало как часы.
да - у меня у каждого устройства был свой журнал в памяти. Приходилось каждый журнал "закручивать" в своем потоке, что он не тормозил. А в каждом журнале был еще поток анализа файловой системы, так как журналы надо было чистить по времени устаревания. А сканирование файловой журнальной системы занимало десятки минут! (у нас в сутки система накапливает около 500 файлов объемом под 10ГБайт).
Записан
Alechin
Гость
Re: Работа из QSerialPort из разных потоков
«
Ответ #64 :
Март 24, 2017, 10:24 »
Цитата: kuzulis от Март 24, 2017, 10:13
Удивительно, правда? А с чего бы оно должно работать?
Удивительно! а с чего оно не должно работать? Сделать системный вызов записи в файл из другого потока невозможно? с каких это пор? Система не позволяет? или все-таки Qt не позволяет?
Цитата: kuzulis от Март 24, 2017, 10:13
А документацию мы читаем, или пытаемся с наскоку
наделать потоков (понатыкать везде WaitFor, ну да, не резиновая),
а потом плачемся что оно тормозит и крешится?
а с чего поток должен тормозить на WaitFor? поток на WaitFor должен уйти в спячку и никаким образом не нагружать систему. Или в Qt WaitFor сделан через цикл опроса?!
Цитата: kuzulis от Март 24, 2017, 10:13
PS: Интересно, удивлю, если скажу, что в Qt все классы QIODevice
не позволяют так делать - дергать методы из разныз потоков
(да и вообще все классы QObject по большому счету)!
это действительно интересно. Чем объясняется? дуростью разработчиков? система позволяет, а среда разработки не дает?
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Работа из QSerialPort из разных потоков
«
Ответ #65 :
Март 24, 2017, 10:25 »
Жесть. У меня сервис, который принимает данные от 20К трекеров (каждый шлет по несколько сообщений в секунду, сообщение - это n байт бинарных или текстовых данных), парсит данне, формирует xml и отсылает их в другую программу. Так же, отправляет команды на трекеры, логгирует работу, сохраняет xml и пр. И все, за исключением работы с диском, происходит в одном потоке. ЧЯДНТ?
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Работа из QSerialPort из разных потоков
«
Ответ #66 :
Март 24, 2017, 10:27 »
> это действительно интересно. Чем объясняется? дуростью разработчиков? система позволяет, а среда разработки не дает?
Системе насрать на потоки, работа с ними ложится на плечи разработчика. И чтобы не получить полную хрень в данных, когда несколько потоков пишут в один файл, разработчику приходится разруливать, использовать мютексы или что-то еще. Так вот, у Кьюта своя логика работы с потоками (которая все разруливает за тебя). Она очень хорошо продумана и работает безотказно уже долгие годы. Если ты не понимаешь ее, это не значит, что проблема в ней.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alechin
Гость
Re: Работа из QSerialPort из разных потоков
«
Ответ #67 :
Март 24, 2017, 10:30 »
Цитата: Пантер от Март 24, 2017, 10:25
Жесть. У меня сервис, который принимает данные от 20К трекеров (каждый шлет по несколько сообщений в секунду, сообщение - это n байт бинарных или текстовых данных), парсит данне, формирует xml и отсылает их в другую программу. Так же, отправляет команды на трекеры, логгирует работу, сохраняет xml и пр. И все, за исключением работы с диском, происходит в одном потоке. ЧЯДНТ?
еще раз повторю - у вас нет двух десятков железяк (8 LAN, 10 RS485, 128IO) которые могут отвалится, зависнуть, начать "штормить". При этом поток данных только от одного устройства около 100КБ в секунду. Данные надо распарсить, проанализировать, сбросить в журнал. Проверка оборудования проста. Подходим, выдергиваем что-нибудь или меняем местами кабели. Система должна в течение секунды восстановить работу и записать в системный журнал что с ней произошло. пользователя нет, более того - монитора обычно тоже нет. Пожаловаться некому, а продолжить работу надо. При этог не повлиять на десяток соседних устройств. При этом машинка - слабенький пром.комп с пентиумом.
Что приозойдет с одним потоком когда одно из устройств "заштормит"? или вы начнете сканировать файловую систему из 50 тысяч файлов? так вот скажу вам что сканирование такой файловой системы занимает около 3-ех часов.
«
Последнее редактирование: Март 24, 2017, 10:33 от Alechin
»
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Работа из QSerialPort из разных потоков
«
Ответ #68 :
Март 24, 2017, 10:35 »
Ну, отвалилась - поймали сигнал и переподключились. В чем проблема? Сокеты у меня тоже рвутся.
А если мне надо будет просканировать файловую, то сканирование я вынесу в отдельный поток. А еще лучше, воспользуюсь пулом потоков.
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alechin
Гость
Re: Работа из QSerialPort из разных потоков
«
Ответ #69 :
Март 24, 2017, 10:36 »
Цитата: Пантер от Март 24, 2017, 10:27
Системе насрать на потоки, работа с ними ложится на плечи разработчика. И чтобы не получить полную хрень в данных, когда несколько потоков пишут в один файл, разработчику приходится разруливать, использовать мютексы или что-то еще. Так вот, у Кьюта своя логика работы с потоками (которая все разруливает за тебя). Она очень хорошо продумана и работает безотказно уже долгие годы. Если ты не понимаешь ее, это не значит, что проблема в ней.
я все понимаю. и атомарные очереди с критическими секциями и событиями записи для других потоков, и прочее. все это само собой на разработчике. но и разработчики не "студенты-писатели чатов".
зачем это перекладывать на Qt - это должно быть в руках разработчика, что бы он четко понимал что произойдет, если и как с этим бороться.
Записан
Alechin
Гость
Re: Работа из QSerialPort из разных потоков
«
Ответ #70 :
Март 24, 2017, 10:38 »
Цитата: Пантер от Март 24, 2017, 10:35
Ну, отвалилась - поймали сигнал и переподключились. В чем проблема? Сокеты у меня тоже рвутся.
А если мне надо будет просканировать файловую, то сканирование я вынесу в отдельный поток. А еще лучше, воспользуюсь пулом потоков.
я выше указал две ситуации когда вы ничего поймаете у отвалившегося устройства.
а когда устройство "заштормит"? ваш один эвент луп справится?
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Работа из QSerialPort из разных потоков
«
Ответ #71 :
Март 24, 2017, 10:38 »
Цитата: Alechin от Март 24, 2017, 10:36
Цитата: Пантер от Март 24, 2017, 10:27
Системе насрать на потоки, работа с ними ложится на плечи разработчика. И чтобы не получить полную хрень в данных, когда несколько потоков пишут в один файл, разработчику приходится разруливать, использовать мютексы или что-то еще. Так вот, у Кьюта своя логика работы с потоками (которая все разруливает за тебя). Она очень хорошо продумана и работает безотказно уже долгие годы. Если ты не понимаешь ее, это не значит, что проблема в ней.
я все понимаю. и атомарные очереди с критическими секциями и событиями записи для других потоков, и прочее. все это само собой на разработчике. но и разработчики не "студенты-писатели чатов".
зачем это перекладывать на Qt - это должно быть в руках разработчика, что бы он четко понимал что произойдет, если и как с этим бороться.
А зачем? Ты велосипедишь в кажом проекте? Возможно, у тебя ест на это время, у меня его нет, мне надо работу делать. Поэтому я с радостью возложил данные проблемы на Qt и использую предоставленную мне архитектуру. Code less, create more!
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Работа из QSerialPort из разных потоков
«
Ответ #72 :
Март 24, 2017, 10:39 »
Цитата: Alechin от Март 24, 2017, 10:38
Цитата: Пантер от Март 24, 2017, 10:35
Ну, отвалилась - поймали сигнал и переподключились. В чем проблема? Сокеты у меня тоже рвутся.
А если мне надо будет просканировать файловую, то сканирование я вынесу в отдельный поток. А еще лучше, воспользуюсь пулом потоков.
я выше указал две ситуации когда вы ничего поймаете у отвалившегося устройства.
а когда устройство "заштормит"? ваш один эвент луп справится?
По поводу вытыкания патчкорда. Ну, заведи ты еще один экземпляр QTcpSocker и по таймеру подключай его/отключай и проверяй подключился ли он. Зачем для этого отдельный поток?
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Alechin
Гость
Re: Работа из QSerialPort из разных потоков
«
Ответ #73 :
Март 24, 2017, 10:40 »
я не "вилосипедю". мои системы управляют в реальном времени движением поездов (велком ту ПостЭЦ пассажирской станции москва-ленинградская и можно посмтреть в реальном времени как управляется осаживание поездов в тупики.
Записан
Alechin
Гость
Re: Работа из QSerialPort из разных потоков
«
Ответ #74 :
Март 24, 2017, 10:42 »
Цитата: Пантер от Март 24, 2017, 10:35
По поводу вытыкания патчкорда. Ну, заведи ты еще один экземпляр QTcpSocker и по таймеру подключай его/отключай и проверяй подключился ли он. Зачем для этого отдельный поток?
а таймер в Qt какой? WM_TIMER или WaitableTimer?
вы уверены что на QTimer "можно положится"?
Записан
Страниц:
1
...
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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...