Russian Qt Forum
Июля 04, 2025, 18:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QextSerialPort  (Прочитано 4856 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« : Августа 13, 2013, 15:27 »

Подскажите из-за чего может быть такой баг.

Делаю коннект.
Код:
port = new QextSerialPort(namePort);
            port->setBaudRate(baud);
            port->setDataBits(data_bits);
            port->setFlowControl(flow);
            port->open(QIODevice::ReadWrite);

            connect(port,SIGNAL(readyRead()),this,SLOT(Receive()));
            connect(ui->pushButtonSend,SIGNAL(clicked()),this,SLOT(Transmit()));     
Пишу в порт.
Код:
port->write(usbdata.data(),usbdata.size());
Все нормально.
После отключаю порт.
Код:
  port->close();
 port->deleteLater();
Затем заново подключаю.
Только после этого он вместо одной посылки, посылает две такие же.
Т.е сначала одну и сразу же вторую такую же.

Не могу понять почему?
Заранее спасибо!
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Августа 13, 2013, 15:33 »

Код:
port->deleteLater();
Это не удаляет объект, а ставит его лишь в очередь для удаления. Видимо вы делаете второй коннект до выхода программы в event loop. Попробуйте просто delete port;

Из документации:
Цитировать
void QObject::deleteLater() [slot]
Schedules this object for deletion.

The object will be deleted when control returns to the event loop. If the event loop is not running when this function is called (e.g. deleteLater() is called on an object before QCoreApplication::exec()), the object will be deleted once the event loop is started. If deleteLater() is called after the main event loop has stopped, the object will not be deleted. Since Qt 4.8, if deleteLater() is called on an object that lives in a thread with no running event loop, the object will be destroyed when the thread finishes.

Note that entering and leaving a new event loop (e.g., by opening a modal dialog) will not perform the deferred deletion; for the object to be deleted, the control must return to the event loop from which deleteLater() was called.

Note: It is safe to call this function more than once; when the first deferred deletion event is delivered, any pending events for the object are removed from the event queue.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #2 : Августа 13, 2013, 15:37 »

Нет не помогает
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #3 : Августа 13, 2013, 15:42 »

Покажите код как вы делаете коннект, по текущему обрывку не совсем понятно где собака зарыта.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
_OLEGator_
Гость
« Ответ #4 : Августа 13, 2013, 15:45 »

Надо научиться пользоваться отладчиком и смотреть почему 2 раза вызывается функция записи.
Скорее всего 2 раза вызывается слот из-за лишнего коннекта.
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #5 : Августа 13, 2013, 15:51 »

Код:
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    connection = false;   
}

Код:
void Widget::connect_port()
{
if(!connection)
    {      
            port = new QextSerialPort(namePort);
            port->setBaudRate(baud);
            port->setDataBits(data_bits);
            port->setFlowControl(flow);
            port->open(QIODevice::ReadWrite);

            connect(port,SIGNAL(readyRead()),this,SLOT(Receive()));
            connect(ui->pushButtonSend,SIGNAL(clicked()),this,SLOT(Transmit()));          

            connection = true;
        }
        else
    {
    }
}


Код:

void Widget::disconnect_port()
{
    if(connection)
    {
        port->close();
        delete port;
        connection = false;      
    }
    else
    {
        qDebug()<<"connection is not set";
    }
« Последнее редактирование: Августа 13, 2013, 15:56 от demaker » Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #6 : Августа 13, 2013, 16:03 »

_OLEGator_ правильно сказал.

Вот косяк
Код:
connect(ui->pushButtonSend,SIGNAL(clicked()),this,SLOT(Transmit()));  
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #7 : Августа 13, 2013, 16:04 »

Поясните точнее Улыбающийся
А то я туплю Улыбающийся
Извините
« Последнее редактирование: Августа 13, 2013, 16:14 от demaker » Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #8 : Августа 13, 2013, 16:05 »

Надо коннект в конструктор засунуть?
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #9 : Августа 13, 2013, 16:06 »

Сколько раз вызывается void Widget::connect_port(), столько раз создается соединение кнопки и слота Transmit.
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #10 : Августа 13, 2013, 16:08 »

Спасибо  Улыбающийся
Извините, что отвлек по пустяку Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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