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

    QT实现多线程的方法较多,而且线程多开会涉及临界数据的读写冲突,每次临界变量修改时需要添加线程锁来保证读写的唯一性。
    虽然说了那么多,但是本博客还是从最简单的单线程开始,以创建单线程为例,相应定时器函数实现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数据的程序非常简单,本博客不详细讲述,放出下载连接自行下载。
https://download.csdn.net/download/weixin_43552197/33604205
本文更正后项目下载链接如下:
https://download.csdn.net/download/weixin_43552197/86020040
感谢评论区mag-angel对本文内容存在的问题进行指出,我已经将文章内容进行了更正,新的项目下载链接已经放出,我在里面通过新的实验说明了博客存在的问题,同时呢保留本博客以提供正确与错误的对比,使得更容易理解问题所在。

  • 8
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小峰呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值