qt+多线程(moveToThread)+udp

线程头文件

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值