ReceiveThread::ReceiveThread(QQueue<char *>& q):queue(q)
{
}
void ReceiveThread::run()
{
char *p;
while(true)
{
MyUdpSocket &usock=MyUdpSocket::getInstance();
bool b=false;
while(usock.hasPendingDatagrams())
{
b=true;
p=new char[165];
usock.readDatagram(p,165);
queue.push_back(p);
}
if(b)
emit this->complete();
}
}
因为qudpsocket丢包,所以我把接收udp报文的部分单拿出来作了个线程.
这个线程的内容就是,把数据接收,然后丢进一个QQueue类对象里,发出complete信号.
主页面会连接这个信号,启动某个槽函数从队列里取出字符串进行处理.
....但这个线程依然保持10个包丢1个的丢包率,还有哪些部分可以改良吗?
MyUdpSocket::getInstance()
&usock
&queue
不是线程安全。while(true)
建议加入sleep
。QUdpSocket
本身有readyRead()
信号,你只需要将连接到数据处理槽即可,不必再加接口。UDP
本身确实会丢包,可以考虑RUDP
库。