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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QextSerialPort  (Прочитано 4617 раз)
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.044 секунд. Запросов: 23.