首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt4.8定期发送不规则数据

Qt4.8定期发送不规则数据
EN

Stack Overflow用户
提问于 2013-10-10 09:02:56
回答 1查看 195关注 0票数 0

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

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

到目前为止,我的货运代理公司的工作如下:

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

我的第一个(天真的)想法是,在每个QUdpSocket::writeDatagram调用之后,让线程睡眠保持100微秒,但这似乎是一种糟糕的方法,因为我将挂起整个线程,因此(我不确定)丢失了在此期间到达的VLC数据包。

我想到的另一个解决方案是创建一个单热点Qtimer,它将延迟writeDatagram()调用。但在这里,我不确定如果另一个数据包到达并再次触发receivePacket()时隙,从而覆盖我试图延迟发送的消息,会发生什么情况。

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

提前谢谢你!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-10 09:26:06

据我所知,sendPacket()方法被调用为fast/经常。这意味着您需要创建一个缓冲区,但这非常容易(如果在receivePacket和sendPacket的多个线程中运行,还需要在访问缓冲区之前/之后添加QMutex::lock()/unlock() )

在课堂上:

代码语言:javascript
复制
QTimer *timer;  // Timer for periodically calling a sendPacket
QList<MyPacketClass*> buffer; // List containing the packets to be sent

在Class.cpp构造器中,创建具有连接的定时器:

代码语言:javascript
复制
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(slotSendPacket()));
timer->start(1000); // Every second

在receivePacket()中,只需将数据添加到列表中:

代码语言:javascript
复制
buffer.append(new MyPacketClass(data));

在class.cpp中,从列表中创建连接和弹出数据的套接字:

代码语言:javascript
复制
void SomeClass::slotSendPacket()
{
  if(buffer.size() > 0)
  {
    sendPacket(buffer.takeAt(0));
  }
}

在方法sendPacket(MyPacketClass* inData)中,释放分配的内存:

代码语言:javascript
复制
Do_whatever_needs_to_be_done_and_sent(); // Here is writeDatagram();
delete inData; // Free the memory for Packetclass
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19291447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档