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

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

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

Сообщений: 976



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

Есть Linux с поднятым ntp сервером, который синхронизируется с GPS приемником, подключенным через COM порт. При этом мне надо-бы управлять приемником (писать/читать в этот порт). Могу я как-нибудь "расшарить" используемый порт между ntp сервером и моим приложением?
Записан
Phoenix
Гость
« Ответ #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

Сообщений: 2812


Просмотр профиля
« Ответ #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
Гость
« Ответ #1293 : Февраль 02, 2018, 09:15 »

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

Сообщений: 103


Просмотр профиля
« Ответ #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

Сообщений: 2812


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

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

ArchLinux x86_64 / Win10 64 bit
poru
Самовар
**
Offline Offline

Сообщений: 103


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

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

Сообщений: 861


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


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

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

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


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

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

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

Записан

ArchLinux x86_64 / Win10 64 bit
poru
Самовар
**
Offline Offline

Сообщений: 103


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

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

Сообщений: 2812


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

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

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

ArchLinux x86_64 / Win10 64 bit
todimka
Гость
« Ответ #1301 : Ноябрь 13, 2018, 06:15 »

Подскажите пожалуйста, существует ли в QSP возможность определять момент, когда данные физически полностью переданы через UART? Через регистры порта это вроде несложно было бы сделать, но к ним доступа под win нету Грустный
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1302 : Ноябрь 13, 2018, 12:24 »

нет
Записан

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

Сообщений: 2812


Просмотр профиля
« Ответ #1303 : Октябрь 07, 2020, 10:40 »

Всем доброго времени.

Наконец - таки я принял решение уйти из проекта и больше не сопровождать QtSerialPort. У меня больше нет на это времени, желания, да и вообще "перегорел".

Всем спасибо кто пользовался этим модулем.  Улыбающийся
Записан

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

Сообщений: 11445


Просмотр профиля
« Ответ #1304 : Октябрь 07, 2020, 11:18 »

Наконец - таки я принял решение уйти из проекта и больше не сопровождать QtSerialPort. У меня больше нет на это времени, желания, да и вообще "перегорел".
Имеете полное право. Но тогда уж в названии поменяйте "создаю" на "создал"  Улыбающийся
Записан
Страниц: 1 ... 85 86 [87] 88   Вверх
  Печать  
 
Перейти в:  


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