Qt4.8周期性发送不规则数据

Posted

技术标签:

【中文标题】Qt4.8周期性发送不规则数据【英文标题】:Qt4.8 periodic sending of irregular data 【发布时间】:2013-10-10 09:02:56 【问题描述】:

我正在为 VLC 开发转发器应用程序并遇到以下问题:

转发器应该接收 UDP 流并将其转发到另一个中间件,然后将数据包放在时间触发的网络上。我的问题在于 VLC 发送的数据包的不规则性。一旦 VLC 开始快速连续发送许多数据包(例如,通常在场景变化期间),目标网络以周期性方式处理消息,导致其丢帧。我需要对这些突发数据强制执行零星行为,以便它们可以随心所欲地到达,但会以最短的间隔时间进行转发。

到目前为止,我的转发器工作如下:

我把整个东西放在一个 QThread 中,并将 readyRead() 信号连接到我的 receivePacket() 插槽,该插槽通过调用再次处理接收、处理和发送数据第二个函数sendPacket()

我的第一个(天真的)想法是让线程 sleep 在每次 QUdpSocket::writeDatagram 调用后保持 100 微秒,但这似乎不太好方法,因为我将暂停整个线程,因此(我不确定这一点)会丢失来自 VLC 的在此期间到达的数据包。

我想到的另一个解决方案是创建一个单次Qtimer,这会延迟writeDatagram() 调用。但是在这里,我不确定如果另一个数据包到达并再次触发 receivePacket() 插槽并因此覆盖我试图延迟发送的消息会发生什么。

有没有简单的方法来解决这个问题?我能想象的唯一可能的方法是向发送者引入一个内部缓冲区,但这听起来需要做很多工作,而且由于我已经到了最后期限,所以我想避免这种情况。

提前谢谢你!

【问题讨论】:

【参考方案1】:

据我了解,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 构造函数中创建带有连接的计时器:

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

【讨论】:

哇,这真的比我想象的要容易得多。非常感谢!

以上是关于Qt4.8周期性发送不规则数据的主要内容,如果未能解决你的问题,请参考以下文章

STP角色选举规则

小姐姐带你入门Alertmanager与Prometheus告警规则

基于不规则时间序列数据计算规则周期平均值的最佳方法

SDL + OpenGL,具有周期性尖峰的不规则帧时间

22.周期性发送ARP响应包

22.周期性发送ARP响应包