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

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

Страниц: 1 ... 85 86 [87]   Вниз
  Печать  
Автор Тема: Создаю библиотеку для работы с последовательными портами. [В ПРОЦЕССЕ].  (Прочитано 322408 раз)
xokc
Птица говорун
*****
Offline Offline

Сообщений: 970



Просмотр профиля
« Ответ #1290 : Декабрь 11, 2016, 22:39 »

Есть Linux с поднятым ntp сервером, который синхронизируется с GPS приемником, подключенным через COM порт. При этом мне надо-бы управлять приемником (писать/читать в этот порт). Могу я как-нибудь "расшарить" используемый порт между ntp сервером и моим приложением?
Записан
Phoenix
Чайник
*
Offline Offline

Сообщений: 58


Просмотр профиля
« Ответ #1291 : Январь 31, 2018, 13:17 »

Столкнулся с утечкой памяти при определенных обстоятельствах. Утечка возникает только на WinXP. Если эту же самую программу запустить на Win7, то утечки нет. Qt 5.6.3 (хоть mingw, хоть msvc 2015).

Для воспроизведения проблемы нужно немного подредактировать программу blockungmaster, сделать чтобы при нажатии кнопки данные отправлялись бы все время:
В функции void MasterThread::run()
в самом конце комментируем: cond.wait(&mutex);

Где нибудь, например перед записью в порт или после чтения, добавляем msleep(2); - если это убрать, то утечки нет. Эта задержка - перестраховка, на случай если попадется промежуточный (RS232->RS482) экзотический преобразователь, у которого не нулевое время переключения с передачи на прием и обратно. Сам я с таким не сталкивался, но читал что такое есть и решил перестраховаться.

Соединяем rx и tx (я использую usb-rs232) и запускаем программу. Утечку можно наблюдать в диспетчере задач, последите минуту. За сутки может набежеть 200 Мб.

В принципе проблема не критична, я могу и не использовать msleep(2), но может это поможет найти возможные сопутствующие проблемы.
« Последнее редактирование: Январь 31, 2018, 13:44 от Phoenix » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2638


Просмотр профиля
« Ответ #1292 : Январь 31, 2018, 14:07 »

См. https://bugreports.qt.io/browse/QTBUG-48653 может поможет. Если не поможет - то не используй waitForXXX, используй асинхронный подход с readyRead/bytesWritten сигналами.

Никто (Я) править для WinXP и Qt5.6.3 не будет(у) ничего. Но если проблема повторится с Qt 5.9.x || 5.10.x то тогда посмотрим.
« Последнее редактирование: Январь 31, 2018, 14:11 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Phoenix
Чайник
*
Offline Offline

Сообщений: 58


Просмотр профиля
« Ответ #1293 : Февраль 02, 2018, 09:15 »

Это действительно помогло.
« Последнее редактирование: Февраль 02, 2018, 11:08 от Phoenix » Записан
poru
Чайник
*
Offline Offline

Сообщений: 96


Просмотр профиля
« Ответ #1294 : Август 09, 2018, 09:24 »

Поймал баг. При записи в порт получаю сообщение:
Цитировать
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QSerialPort(0x15cfec0), parent's thread is SerialReader(0x159c420), current thread is QThread(0x316fb8)

Код
C++ (Qt)
SerialReader::SerialReader(QObject *parent) : QThread(parent)
{
   m_serialPort = new QSerialPort;
   m_serialPort->moveToThread(this);
   connect(m_serialPort, &QSerialPort::readyRead, this, &SerialReader::readSerialData);
}
 
void SerialReader::run()
{
   m_serialPort->setPortName("COM1");
   if (!m_serialPort->open(QIODevice::ReadWrite)
           || !m_serialPort->setBaudRate(9600)
           || !m_serialPort->setDataBits(QSerialPort::Data7)
           || !m_serialPort->setParity(QSerialPort::NoParity)
           || !m_serialPort->setStopBits(QSerialPort::TwoStop)
           || !m_serialPort->setFlowControl(QSerialPort::NoFlowControl)
           || !m_serialPort->setDataTerminalReady(true)
           || !m_serialPort->setRequestToSend(false)) {
       emit critical(m_serialPort->errorString());
       return;
   }
 
   exec();
 
   m_serialPort->close();
}
 
void SerialReader::readSerialData()
{
   QByteArray data = m_serialPort->readAll();
   qDebug() << data;
 
   if (data.startsWith("#"))
       m_serialPort->write("...");
}
 
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2638


Просмотр профиля
« Ответ #1295 : Август 09, 2018, 11:00 »

Это не баг, это неправильная работа с тредами. Погуглить наверно стоило прежде чем постить.
Записан

ArchLinux x86_64 / Win10 64 bit
poru
Чайник
*
Offline Offline

Сообщений: 96


Просмотр профиля
« Ответ #1296 : Август 10, 2018, 11:06 »

Мне хорошо известны способы работы с тредами, один через создание некоего Worker, другой через переопределение метода run. Кто из них правильный, а кто нет - тема отдельной дискуссии, но в жизни применяют и тот и другой. Если QSerialPort в одном из вариантов работает не полноценно, то это определенно BUG.
Записан
sergek
Программист
*****
Offline Offline

Сообщений: 557


Мы должны приносить пользу людям!


Просмотр профиля
« Ответ #1297 : Август 10, 2018, 12:29 »

Надо new QSerialPort делать в run.
Записан

Qt 5.11.1 Qt Creator 4.7.0
Win7, Win10, Ubuntu 14.04
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2638


Просмотр профиля
« Ответ #1298 : Август 11, 2018, 14:22 »

> Мне хорошо известны способы работы с тредами

Это вы себя перехваливаете.

Записан

ArchLinux x86_64 / Win10 64 bit
poru
Чайник
*
Offline Offline

Сообщений: 96


Просмотр профиля
« Ответ #1299 : Август 21, 2018, 09:26 »

Есть ли какая возможность прервать функцию ожидания данных waitForReadyRead(), или будет ли она реализована в новой версии? Ну что то типа cancel(), которая прерывает все операции.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2638


Просмотр профиля
« Ответ #1300 : Август 21, 2018, 17:18 »

Нет. Работа с QSP должна быть всегда в одном потоке. Никаких cancel() не предполагается. Нужно использовать асинхронные ф-ции, а не этот треш с waitForXXX().

ЗЫ: Можно попробовать на винде CancelIo() заюзать (дернуть из другого треда, что из этого выйдет - хз).
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: 1 ... 85 86 [87]   Вверх
  Печать  
 
Перейти в:  

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