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数据的程序非常简单,本博客不详细讲述,放出下载连接自行下载。