Информация об изменениях

Сообщение Re: Qt udp от 06.02.2023 9:13

Изменено 06.02.2023 11:32 Skorodum

Re: Qt udp
Здравствуйте, milkpot, Вы писали:


M>void Window::readPendingDatagrams()

M>{
M> ...
M> QByteArray buffer;
M> ....
M> emit writeUdpData(buffer);
M> }
M>}
M>[/ccode]
В случае если сигнал и слот в разных потоках или явного использования Qt::QueuedConnection в connect данные будут скопированы.

В общем случае сетевые операции и GUI лучше делать в разных потоках:
* отедельный поток случает сеть и записывает данные в кольцевой буфер
* потом отправляет сигнал-уведомление о новых данных
* GUI берет данные из кольцевого буфера

M>
M>void Window::setUdpData(const QByteArray& qba)
M>{
M>    QString result;
M>    //result=QString(tr("--- Window _ setUdpData slot"));
M>    int data_quant=81920;
M>    //qDebug() << "receiveUdpData slot";
M>    for(int i=0;i<64;i++)
M>    {
M>        another_qba[i_counter]=qba[i+8];
M>        i_counter++;
M>    }
M>    if(i_counter==data_quant)
M>    {
M>        gui_prepare_generate_data();
M>        i_counter=0;
M>    }
M>        qDebug() << "i_counter" << i_counter;
M>    return;
M>}
M>

Оператор [] у QByteArray (qba[i+8]) делают копию даннах, тут нужно qba.at(i+8)

З.Ы. Если все в рамках одной машины, то QLocalSocket может быть лучше.
Re: Qt udp
Здравствуйте, milkpot, Вы писали:


M>void Window::readPendingDatagrams()

M>{
M> ...
M> QByteArray buffer;
M> ....
M> emit writeUdpData(buffer);
M> }
M>}
M>[/ccode]
Осторожнее: в случае если сигнал и слот в разных потоках или явного использования Qt::QueuedConnection в connect данные будут скопированы.

В общем случае сетевые операции и GUI лучше делать в разных потоках:
* отедельный поток случает сеть и записывает данные в кольцевой буфер
* потом отправляет сигнал-уведомление о новых данных
* GUI берет данные из кольцевого буфера

M>
M>void Window::setUdpData(const QByteArray& qba)
M>{
M>    QString result;
M>    //result=QString(tr("--- Window _ setUdpData slot"));
M>    int data_quant=81920;
M>    //qDebug() << "receiveUdpData slot";
M>    for(int i=0;i<64;i++)
M>    {
M>        another_qba[i_counter]=qba[i+8];
M>        i_counter++;
M>    }
M>    if(i_counter==data_quant)
M>    {
M>        gui_prepare_generate_data();
M>        i_counter=0;
M>    }
M>        qDebug() << "i_counter" << i_counter;
M>    return;
M>}
M>

Оператор [] у QByteArray (qba[i+8]) делает копию даннах, тут нужно qba.at(i+8)

З.Ы. Если все в рамках одной машины, то QLocalSocket может быть лучше.