Qt4.8 периодическая отправка нерегулярных данных

0

Я занимаюсь разработкой приложения-пересылки для VLC и столкнулся с следующей проблемой:

Предполагается, что форвардер получит поток UDP и перенаправит его на другое промежуточное программное обеспечение, которое затем будет помещать пакеты в сеть с включенным временем. Моя проблема заключается в неравномерности пакетов, отправленных VLC. Целевая сеть периодически обрабатывает сообщения, заставляя их отбрасывать кадры, как только VLC начинает отправлять много пакетов в быстрой последовательности (как правило, во время смены сцены, например). Мне нужно принудительно установить спорадическое поведение для этих всплесков данных, чтобы они могли прибыть, как им заблагорассудится, но перенаправить с минимальным промежутком времени.

До сих пор мой экспедитор работал следующим образом:

Я положил все это на QThread и подключил сигнал readyRead() к моему слоту receivePacket(), который обрабатывает прием, обработку и отправку данных снова, вызывая вторую функцию sendPacket()

Моя первая (наивная) идея состояла в том, чтобы просто нити спать, скажем, на 100 микросекунд после каждого QUdpSocket :: writeDatagram вызова, но это похоже на плохой подход, так как я буду подвешиванием всей нити и таким образом (я не уверен, об этом) теряют пакеты из VLC, которые поступают в это время.

Другим решением, о котором я думал, было создание однотипного Qtimer, которое задерживало бы вызов writeDatagram(). Но здесь я не уверен, что произойдет, если другой пакет поступит и снова запустит slotPacket() и, таким образом, перезапишет сообщение, которое я пытаюсь отложить.

Есть ли простой способ решить эту проблему? Единственным способом, который я мог себе представить, было бы введение внутреннего буфера отправителю, но это звучит как большая работа, и поскольку я нахожусь в крайнем сроке, я бы хотел этого избежать.

Заранее спасибо!

Теги:
qt
udp
network-protocols

1 ответ

0
Лучший ответ

Насколько я понял, метод sendPacket() быстро или часто. Это означает, что вам нужно будет создать буфер, но это довольно просто (если запустить в многократных потоках для receivePacket и sendPacket, также добавить буфер QMutex :: lock()/unlock() до и после доступа)

В Class.h:

QTimer *timer;  // Timer for periodically calling a sendPacket
QList<MyPacketClass*> buffer; // List containing the packets to be sent

В Class.cpp Constructor создайте таймер с подключением:

timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(slotSendPacket()));
timer->start(1000); // Every second

В getPacket() просто добавьте данные в список:

buffer.append(new MyPacketClass(data));

В class.cpp создайте сокет для подключения и введите данные из списка:

void SomeClass::slotSendPacket()
{
  if(buffer.size() > 0)
  {
    sendPacket(buffer.takeAt(0));
  }
}

В методе sendPacket (MyPacketClass * inData) освобождается выделенная память:

Do_whatever_needs_to_be_done_and_sent(); // Here is writeDatagram();
delete inData; // Free the memory for Packetclass
  • 0
    Вау, это действительно намного проще, чем я думал. Благодаря тонну!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню