Я занимаюсь разработкой приложения-пересылки для VLC и столкнулся с следующей проблемой:
Предполагается, что форвардер получит поток UDP и перенаправит его на другое промежуточное программное обеспечение, которое затем будет помещать пакеты в сеть с включенным временем. Моя проблема заключается в неравномерности пакетов, отправленных VLC. Целевая сеть периодически обрабатывает сообщения, заставляя их отбрасывать кадры, как только VLC начинает отправлять много пакетов в быстрой последовательности (как правило, во время смены сцены, например). Мне нужно принудительно установить спорадическое поведение для этих всплесков данных, чтобы они могли прибыть, как им заблагорассудится, но перенаправить с минимальным промежутком времени.
До сих пор мой экспедитор работал следующим образом:
Я положил все это на QThread и подключил сигнал readyRead() к моему слоту receivePacket(), который обрабатывает прием, обработку и отправку данных снова, вызывая вторую функцию sendPacket()
Моя первая (наивная) идея состояла в том, чтобы просто нити спать, скажем, на 100 микросекунд после каждого QUdpSocket :: writeDatagram вызова, но это похоже на плохой подход, так как я буду подвешиванием всей нити и таким образом (я не уверен, об этом) теряют пакеты из VLC, которые поступают в это время.
Другим решением, о котором я думал, было создание однотипного Qtimer, которое задерживало бы вызов writeDatagram(). Но здесь я не уверен, что произойдет, если другой пакет поступит и снова запустит slotPacket() и, таким образом, перезапишет сообщение, которое я пытаюсь отложить.
Есть ли простой способ решить эту проблему? Единственным способом, который я мог себе представить, было бы введение внутреннего буфера отправителю, но это звучит как большая работа, и поскольку я нахожусь в крайнем сроке, я бы хотел этого избежать.
Заранее спасибо!
Насколько я понял, метод 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