Сообщение 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>
Оператор [] у QByteArray (qba[i+8]) делают копию даннах, тут нужно qba.at(i+8)
З.Ы. Если все в рамках одной машины, то QLocalSocket может быть лучше.
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>
Оператор [] у QByteArray (qba[i+8]) делает копию даннах, тут нужно qba.at(i+8)
З.Ы. Если все в рамках одной машины, то QLocalSocket может быть лучше.
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 может быть лучше.