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周期性发送不规则数据的主要内容,如果未能解决你的问题,请参考以下文章