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