crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Пропадание сетевого обмена
KuvshinoF
  опции профиля:
сообщение 15.4.2020, 18:14
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 59
Регистрация: 25.7.2013
Пользователь №: 3887

Спасибо сказали: 0 раз(а)




Репутация:   0  


Программа_1 бесконечно посылает 1 раз в секунду определенный набор байтов, а программа_2 его читает, обрабатывает и визуализирует.
Чтение по udp сетевых данных в программе_2:
  QUdpSocket oUDPSocket;
  QByteArray baoBufRecv;
  unsigned short  usSendPort;
  QHostAddress haoLocalAddr, haoSenderAddr;

  baoBufRecv.resize(65535);
  haoLocalAddr.setAddress("127.0.0.1");
  oUDPSocket.bind(haoLocalAddr, 5000);
  connect(&oUDPSocket, SIGNAL(readyRead()), this, SLOT(sltReadDatagram()));
//-----------------------------------------------------------------------------

void Interaction::sltReadDatagram()
{
  vReadDatagram();
}
//-----------------------------------------------------------------------------

void Interaction::vReadDatagram()
{
  while (_oUDPSocket.hasPendingDatagrams())
  {
     long lSize = oUDPSocket.pendingDatagramSize();
     oUDPSocket.readDatagram(baoBufRecv.data(), lSize, &haoSenderAddr, &usSendPort);
    ...
  }
}

class Interaction: public QThread
{
}


Проблема в том, что программа_2 принимает всего около 10 сетевых посылок, а потом vReadDatagram перестает вызываться, как будто перестают идти данные от программы_1, но это не так (проверено индикацией данных от программы_1 в простейшей программе_3 и tcpdump-ом). Программа_2 достаточно сложна (многопоточна, gui c opengl) и что может приводить к такому "сетевому обрыву" - непонятно.

Сообщение отредактировал KuvshinoF - 20.4.2020, 11:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Алексей1153
  опции профиля:
сообщение 20.4.2020, 11:03
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2933
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(KuvshinoF @ 19.4.2020, 0:59) *
vReadDatagram(); // описана ранее в первом сообщении темы


так а где этот слот находится то ? В потоке или в главном окне? У меня смутные подозрения, что с синхронизацией напутано тут

не вижу вызов moveToThread нигде


Цитата(KuvshinoF @ 19.4.2020, 0:59) *
class Interaction : public QThread
{
  QUdpSocket oUDPSocket;
  QByteArray baoBufRecv;

у тебя рабочий объект и поток - одним классом. Тогда уж лучше унаследоваться от QThread

А в твоём варианте рабочий объект должен быть отдельно от потока. Рабочий объект создаётся в ОСНОВНОМ потоке, настраивается, затем перемещается в контекст потока. Я эту практику недолюбливаю, ей не пользуюсь, поэтому за деталями - в интернет ) Я обычно наследуюсь и не испытываю этот гемор

Сообщение отредактировал Алексей1153 - 20.4.2020, 11:07
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.10.2022, 1:51