QT多线程 UdpSocket网络接收问题

ai_rengh 2014-08-07 04:29:51
问题描述:
一个接收网络数据的通道类,继承自QThread
头文件中相关内容
class QChannelRecv : public QThread
{
Q_OBJECT
public:
QUdpSocket *m_pUdpSocketDataRecv; // UdpSocket
int m_iPortData; // 数据端口
QHostAddress m_HAGroupAddress; //组播
QHostAddress m_HALocalAddress; //点对点
.
.
.
public slots:
void processRecvData(void);
void processRecvHeaderInfo(void);
}

源文件中相关内容
void QChannelRecv::run()
{
QString status;
if(m_pUdpSocketDataRecv != NULL)
{
m_pUdpSocketDataRecv->disconnect();
delete m_pUdpSocketDataRecv;
m_pUdpSocketDataRecv = NULL;
}
if(m_pUdpSocketDataRecv==NULL)
{
m_pUdpSocketDataRecv = new QUdpSocket();
m_HALocalAddress= QHostAddress(m_strCardIP);

if(!(m_pUdpSocketDataRecv->bind(m_HALocalAddress, m_iPortData, QUdpSocket::ShareAddress|QUdpSocket::ReuseAddressHint)))
{
status = QString("因数据套接字绑定错误!退出%1接收线程");//.arg(m_strChannelName);
QMessageBox::critical(NULL,tr("Error"),status,QMessageBox::Yes);
return;
}
if(m_bMultiCast)//如果采用组播方式,加入组播地址
{
m_HAGroupAddress = QHostAddress(m_strGroupHostAddress);
m_pUdpSocketDataRecv->setSocketOption(QAbstractSocket::MulticastLoopbackOption,0);
m_pUdpSocketDataRecv->setSocketOption(QAbstractSocket::MulticastTtlOption,3);
if(!(m_pUdpSocketDataRecv->joinMulticastGroup(m_HAGroupAddress)))
{
status = QString("因数据套接字加入组播错误!退出%1接收线程").arg(m_strChannelName);
QMessageBox::critical(NULL,tr("Error"),status);
return;
}
}
connect(m_pUdpSocketDataRecv,SIGNAL(readyRead()),this,SLOT(processRecvData()),Qt::DirectConnection);
}
exec();
}

void QChannelRecv::processRecvData(void)
{
while (m_pUdpSocketDataRecv->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(m_pUdpSocketDataRecv->pendingDatagramSize());
m_pUdpSocketDataRecv->readDatagram(datagram.data(), datagram.size());
DisposeOriginData((unsigned char*)datagram.data(),datagram.size());
}
}

当第一次新建一个QChannelRecv *的对象 pChannelRecv后,调用pChannelRecv->start()
程序正常进入run()函数中,然后可以等待readyread()信号的发出,响应processRecvData(void)槽函数。可是当我执行其他操作,想要先把这个线程QThread关闭(exit()并且 delete pChannelRecv这个对象)后,再打开(pChannelRecv->start())意想不到的事情发生了,run()函数还是正常进入,可以槽函数processRecvData(void)没有得到响应。
然后我做了几次类似的操作,关闭本线程,再开启,其中有极少数的时候是可以进入这个processRecvData槽函数的。
上面都是点对点的发送,然后用组播时发现,这段程序可以顺利的执行。
请大家帮忙看看这里是什么原因造成这样的事情发生,该怎么处理呢?
...全文
788 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

16,203

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧