QT多线程实现UDP数据的发送

    QT实现多线程的方法较多,而且线程多开会涉及临界数据的读写冲突,每次临界变量修改时需要添加线程锁来保证读写的唯一性。
    虽然说了那么多,但是本博客还是从最简单的单线程开始,以创建单线程为例,相应定时器函数实现UDP数据的发送。下面直接上代码:
    整个工程文件目录如下:

QT多线程实现UDP数据的发送_第1张图片

    首先,因为设计网络编程,需要在工程文件中添加network标识。串口的话添加serialport。如下
QT       += core gui network

项目中threadtest.h和threadtest.cpp是建立QWidget项目完成后,在项目中添加名称为ThreadTest的类自动生成的。代码如下:
threadtest.h

#ifndef THREADTEST_H
#define THREADTEST_H

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define cout qDebug()<<"["<<__FILE__<<":"<<__LINE__<<"]"


class ThreadTest : public QObject
{
     
    Q_OBJECT
public:
    explicit ThreadTest(QObject *parent = nullptr);
    // 定时器
    QTimer *myTimer;
    // UDP
    QUdpSocket *mySocket;
    // 线程
    QThread *myThread;


signals:
    // 发送时间日期的信号
    void sendDateTime(QString tmp);

public slots:
	// 获取时间日期的槽函数
    void getDateTime();

};
#endif // THREADTEST_H

threadtest.cpp

#include "threadtest.h"

ThreadTest::ThreadTest(QObject *parent) : QObject(parent)
{
     
    // 加入新建线程
    myThread = new QThread(this);
    myTimer = new QTimer(0);
    this->moveToThread(myThread);
// 实现定时器
connect(myTimer,&QTimer::timeout,this,&ThreadTest::getDateTime,Qt::DirectConnection);
	// 此处一定注意,要严格按照先启动定时器然后加入线程的方式实现,否则会报错,定时器无效果。
    myTimer->start(1000);
    myTimer->moveToThread(myThread);
    // 最后开启线程
    myThread->start();
}
// 获取当前日期时间
void ThreadTest::getDateTime()
{
     
    QString myTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
    cout<<myTime;
    // 发送信号
    emit sendDateTime(myTime);
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "threadtest.h"

#define cout qDebug()<<"["<<__FILE__<<":"<<__LINE__<<"]"

namespace Ui {
     
class Widget;
}

class Widget : public QWidget
{
     
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    // udp
    QUdpSocket *mySocket;
    // 线程类
    ThreadTest *localThread;
public slots:
	// 接收信号的槽函数,并发送到指定UDP端口
    void sendDataToUdp(QString data);
private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
     
    ui->setupUi(this);
    localThread = new ThreadTest;
	
	// 创建对象,绑定UDP端口
    mySocket = new QUdpSocket();
    mySocket->bind(3090);
    // 将发送信号与接收信号连接起来
    connect(localThread,SIGNAL(sendDateTime(QString)),this,SLOT(sendDataToUdp(QString)));

}

Widget::~Widget()
{
     
    delete ui;
}

void Widget::sendDataToUdp(QString data)
{
     
    QString receid = tr(data.toLatin1().data());
    mySocket->writeDatagram(receid.toUtf8(),QHostAddress("127.0.0.1"),3099);
}

程序运行后,udp接收端会受到当前电脑日期时间的数据,同时会在编译器下方同时打印,结果如下。
QT多线程实现UDP数据的发送_第2张图片关于接收UDP数据的程序非常简单,本博客不详细讲述,放出下载连接自行下载。
https://download.csdn.net/download/weixin_43552197/33604205
本文的项目下载链接如下:
https://mp.csdn.net/mp_download/manage/download/UpDetailed

你可能感兴趣的:(QT,qt,udp,开发语言)