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://mp.csdn.net/mp_download/manage/download/UpDetailed
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/330277.html
標籤:其他
