QThread监听UDP报文实践

参考

线程参考 https://blog.csdn.net/jinhucheng/article/details/70371724
udp参考 https://blog.csdn.net/weixin_42216430/article/details/80780297

思路

proc.moveToThread(&thread);//proc中所有的槽都会在另一个线程(thread)中执行

UdpReceiver

槽receive 监听udp报文,把监听到的报文放入一个线程安全的容器C,抛出 readyProcess信号

Processor

readyProcess 触发processUdp槽,从容器C拿出数据进行处理

代码

#ifndef UDPRECEIVER_H
#define UDPRECEIVER_H

#include <QObject>
#include <QUdpSocket>

class UdpReceiver : public QObject
{
    Q_OBJECT
public:
    explicit UdpReceiver(QObject *parent = nullptr);
    ~UdpReceiver();

signals:
    /**
     * @brief 在receive槽中抛出它,表明可以进行下一步的费时处理
     */
    void readyProcess();
public slots:
    /**
     * @brief 将readyRead信号与它连接
     */
    void receive();
private:
    QUdpSocket *udpSocket;
};

#endif // UDPRECEIVER_H
#include "udpreceiver.h"
#include <QByteArray>
#include <QThread>
UdpReceiver::UdpReceiver(QObject *parent) : QObject(parent)
{
    udpSocket = new QUdpSocket;
    udpSocket->bind(QHostAddress("127.0.0.1"), 4567);
    connect(udpSocket, SIGNAL(readyRead()), this, SLOT(receive()));
}
UdpReceiver::~UdpReceiver()
{
    delete udpSocket;
}
void UdpReceiver::receive()
{
    qDebug()<<"thread "<<QThread::currentThreadId()<<"receive";
    QByteArray ba;
    while(udpSocket->hasPendingDatagrams())
    {
        ba.resize(udpSocket->pendingDatagramSize());
        udpSocket->readDatagram(ba.data(), ba.size());
        qDebug()<< ba.data();
        
    }
    //将数据放进一个共享的互斥容器C
    emit readyProcess();
}
#ifndef PROCESSOR_H
#define PROCESSOR_H

#include <QObject>
/**
 * @brief 处理UDP监听到的数据
 */
class Processor : public QObject
{
    Q_OBJECT
public:
    explicit Processor(QObject *parent = nullptr);

signals:

public slots:
    /**
     * @brief 复杂的处理报文操作
     */
    void processUdp();
};

#endif // PROCESSOR_H

#include "processor.h"
#include <QThread>
#include <QDebug
Processor::Processor(QObject *parent) : QObject(parent)
{
}
void Processor::processUdp(){
     qDebug()<<"thread "<<QThread::currentThreadId()<<"start process ";
    //从共享的容器C中取数据 
     //代表复杂的操作
     int i=1000000000;
     while(i-->0){}
     qDebug()<<"process done";
}

#include <QCoreApplication>
#include "udpreceiver.h"
#include "processor.h"
#include <QThread>
int main(int argc, char *argv[])
{
    qDebug()<<"main thread "<<QThread::currentThreadId();
    QCoreApplication a(argc, argv);
    QThread thread;
    UdpReceiver rec;
    Processor proc;
    proc.moveToThread(&thread);//proc中所有的槽都会在另一个线程中执行
    QObject::connect(&rec, SIGNAL(readyProcess()), &proc, SLOT(processUdp()));
    thread.start();

    return a.exec();
}

上述代在主线程中接收数据,在线程中处理数据

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QUdpSocket 是 C++ Qt 框架中的一个类,用于实现 UDP(User Datagram Protocol)套接字通信。UDP 是一种无连接的、不可靠的传输协议,适用于对数据传输延迟要求较低、可容忍丢失或乱序的场景。 QUdpSocket 类提供了发送和接收 UDP 数据报的方法,并支持多主机之间的通信。它可以在客户端和服务器之间进行双向通信,也可以用于广播和多播的应用。 可以使用 QUdpSocket 类的实例来创建一个 UDP 套接字,并通过调用相应的函数来发送和接收数据报。常用的函数包括 bind() 绑定本地地址和端口、readDatagram() 读取数据报、writeDatagram() 发送数据报等。 以下是一个使用 QUdpSocket 类实现简单 UDP 通信的示例代码: ```cpp #include <QtNetwork> int main() { // 创建 QUdpSocket 对象 QUdpSocket udpSocket; // 绑定本地地址和端口 udpSocket.bind(QHostAddress::LocalHost, 12345); // 发送数据报 QByteArray datagram = "Hello, World!"; udpSocket.writeDatagram(datagram, QHostAddress::LocalHost, 6789); // 接收数据报 while (udpSocket.hasPendingDatagrams()) { QByteArray receivedDatagram; receivedDatagram.resize(udpSocket.pendingDatagramSize()); udpSocket.readDatagram(receivedDatagram.data(), receivedDatagram.size()); qDebug() << "Received datagram:" << receivedDatagram; } return 0; } ``` 以上代码创建了一个 UDP 套接字对象 udpSocket,并将其绑定到本地地址和端口 12345。然后使用 writeDatagram() 函数发送数据报给本地地址和端口 6789。接下来使用 readDatagram() 函数接收数据报,并打印在控制台上。 这只是一个简单的示例,QUdpSocket 类还提供了许多其他功能和函数,可以根据需求进行更复杂的 UDP 通信实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值