Russian Qt Forum

Qt => Вопросы новичков => Тема начата: demaker от Август 13, 2013, 15:27



Название: QextSerialPort
Отправлено: demaker от Август 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();
Затем заново подключаю.
Только после этого он вместо одной посылки, посылает две такие же.
Т.е сначала одну и сразу же вторую такую же.

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


Название: Re: QextSerialPort
Отправлено: kibsoft от Август 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.


Название: Re: QextSerialPort
Отправлено: demaker от Август 13, 2013, 15:37
Нет не помогает


Название: Re: QextSerialPort
Отправлено: kibsoft от Август 13, 2013, 15:42
Покажите код как вы делаете коннект, по текущему обрывку не совсем понятно где собака зарыта.


Название: Re: QextSerialPort
Отправлено: _OLEGator_ от Август 13, 2013, 15:45
Надо научиться пользоваться отладчиком и смотреть почему 2 раза вызывается функция записи.
Скорее всего 2 раза вызывается слот из-за лишнего коннекта.


Название: Re: QextSerialPort
Отправлено: demaker от Август 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";
    }


Название: Re: QextSerialPort
Отправлено: kibsoft от Август 13, 2013, 16:03
_OLEGator_ правильно сказал.

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


Название: Re: QextSerialPort
Отправлено: demaker от Август 13, 2013, 16:04
Поясните точнее :)
А то я туплю :)
Извините


Название: Re: QextSerialPort
Отправлено: demaker от Август 13, 2013, 16:05
Надо коннект в конструктор засунуть?


Название: Re: QextSerialPort
Отправлено: kibsoft от Август 13, 2013, 16:06
Сколько раз вызывается void Widget::connect_port(), столько раз создается соединение кнопки и слота Transmit.


Название: Re: QextSerialPort
Отправлено: demaker от Август 13, 2013, 16:08
Спасибо  :)
Извините, что отвлек по пустяку :)