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

udp代码改多线程python udp多线程发送_udp

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

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

#ifndef THREADTEST_H
#define THREADTEST_H

#include <QObject>
#include <QTimer>
#include <QTime>
#include <QUdpSocket>
#include <QHostAddress>
#include <QDebug>
#include <QString>
#include <QThread>
#include <QDateTime>

#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 <QWidget>
#include <QTimer>
#include <QTime>
#include <QUdpSocket>
#include <QHostAddress>
#include <QDebug>
#include <QString>
#include <QThread>
#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接收端会受到当前电脑日期时间的数据,同时会在编译器下方同时打印,结果如下。

udp代码改多线程python udp多线程发送_开发语言_02

关于接收UDP数据的程序非常简单,本博客不详细讲述,放出下载连接自行下载。