线程头文件
#ifndef MYMULSOCKET_H
#define MYMULSOCKET_H
#include <QObject>
#include <QThread>
#include <QTimer>
#include <qdebug>
#include <QUdpSocket>
#include <QMessageBox>
#include "MyDataManage.h"
class MyMulSocket : public QObject
{
Q_OBJECT
public:
MyMulSocket(MyDataManage* data);
void initMyUdp();
void RevSocketData();
void SendSocketData();
private:
QUdpSocket* m_MulUdp;
QTimer* m_Timer;
MyDataManage* pMyDataManage;
QString SocketIP;
int SocketPort;
int isJoinMultiSocket; //加入组播标志 0-failed 1-success
signals:
public slots:
void slot_TimerOut();
void slot_StartThread();
void slot_CloseThread();
};
#endif // MYMULSOCKET_H
线程的实现文件
#include "MyMulSocket.h"
MyMulSocket::MyMulSocket(MyDataManage* data)
{
pMyDataManage = data;
//qDebug()<<"MyMulSocket: "<<QThread::currentThread();
}
void MyMulSocket::initMyUdp()
{
//qDebug()<<"initMyUdp: "<<QThread::currentThread();
m_MulUdp = new QUdpSocket();
SocketIP = "230.168.40.12";
SocketPort = 18433;//18436---18433
//绑定本地端口
qint64 ret = m_MulUdp->bind(QHostAddress::AnyIPv4, SocketPort, QUdpSocket::ShareAddress);
if (!ret)
{
QMessageBox msg;
msg.setText("Bind Port Failed!");
msg.setWindowFlags(Qt::WindowStaysOnTopHint);
msg.exec();
}
//加入组播组
isJoinMultiSocket = m_MulUdp->joinMulticastGroup(QHostAddress(SocketIP));
if(isJoinMultiSocket)
{
//设置缓冲区
m_MulUdp->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption,1024*1024*10);//10M缓冲区
//connect(m_MulUdp,&QUdpSocket::readyRead,this,&MyThreadSocket::RevSocketData);
}
else
{
QMessageBox msg;
msg.setText("Join MulticastGroup Failed!");
msg.setWindowFlags(Qt::WindowStaysOnTopHint);
msg.exec();
}
}
void MyMulSocket::slot_TimerOut()
{
//qDebug()<<"slot_TimerOut: "<<QThread::currentThread();
RevSocketData();
SendSocketData();
}
void MyMulSocket::slot_StartThread()
{
initMyUdp();
m_Timer = new QTimer();
connect(m_Timer,&QTimer::timeout,this,&MyMulSocket::slot_TimerOut);
m_Timer->start(50);
}
void MyMulSocket::slot_CloseThread()
{
m_Timer->stop();;
delete m_Timer;
m_MulUdp->close();
delete m_MulUdp;
}
void MyMulSocket::RevSocketData()
{
char RecDataBuf[MAX_SOCKETBUF];//unsigned
QHostAddress sender;
quint16 senderPort;
if(isJoinMultiSocket)
{
while(1)
{
//qDebug()<<"RevSocketDat = "<< m_MulUdp->bytesAvailable();
qint32 ctrecnum = m_MulUdp->readDatagram((char *)&RecDataBuf,MAX_SOCKETBUF,&sender,&senderPort);
if(ctrecnum < 4)
break;
//进行处理的一些操作
if(ctrecnum > 4) //至少大于包头长度
{
if(!pMyDataManage->MyBuff.isFull())
pMyDataManage->MyBuff.write(RecDataBuf, ctrecnum);
}
}
}
}
void MyMulSocket::SendSocketData()
{
}
在main函数中进行调用
main.h
MyMulSocket* pMyMulSocket;
QThread* m_Thread;```
main.cpp
m_Thread = new QThread();
pMyMulSocket = new MyMulSocket(&tMyDataManage);
pMyMulSocket->moveToThread(m_Thread);
connect(m_Thread,&QThread::started,pMyMulSocket,&MyMulSocket::slot_StartThread);
connect(m_Thread,&QThread::finished,pMyMulSocket,&MyMulSocket::slot_CloseThread);
void Widget::closeEvent(QCloseEvent *event)
{
m_Thread->quit();
m_Thread->wait();
delete m_Thread;
}