【QT Thread】

1.QThread 使用

cpp 复制代码
#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QObject>
#include <QThread>

class MyThread : public QThread
{
    Q
    _OBJECT
public:
    explicit MyThread(QObject *parent = nullptr);
    void run() override;
    void setFlag(bool run_flag);

signals:
    void sig_updateNum(int num);

private:
    bool run_flag;



};

#endif // MYTHREAD_H
cpp 复制代码
#include "MyThread.h"
#include <QDebug>

MyThread::MyThread(QObject *parent) : QThread(parent)
{

}

void MyThread::run()
{
    while(run_flag){
        static int num = 0;
        ++num;
        QThread::msleep(100);
        qDebug() << Q_FUNC_INFO << QThread::currentThreadId();
        emit sig_updateNum(num);
    }
}

void MyThread::setFlag(bool run_flag)
{
    this->run_flag = run_flag;
}
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle(QStringLiteral("test"));
    initThread();
    qDebug() << Q_FUNC_INFO << QThread::currentThreadId();


}

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

void MainWindow::initThread()
{
    myThread = new MyThread();
    connect(myThread, &MyThread::sig_updateNum, this, [&](int num){
        ui->lineEdit_id->setText(QString::number(num));
    });
}


void MainWindow::on_pushButton_stop_clicked()
{
    myThread->setFlag(false);
}


void MainWindow::on_pushButton_clicked()
{
    myThread->start();
}

2.QMutex 使用-线程间通讯-共享资源

cpp 复制代码
#ifndef WRITETHREAD_H
#define WRITETHREAD_H

#include <QObject>
#include <QThread>
#include <QMutex>

struct SHARE_MSG{
    char msg[128];
};

class WriteThread : public QThread
{
    Q_OBJECT
public:
    explicit WriteThread(QMutex* m_mutex, SHARE_MSG* m_msg, QObject *parent = nullptr);
    void run() override;

signals:

private:
    QMutex *m_mutex;
    SHARE_MSG* m_msg;

};

#endif // WRITETHREAD_H
cpp 复制代码
#include "WriteThread.h"
#include <QDebug>


WriteThread::WriteThread(QMutex *m_mutex, SHARE_MSG *m_msg, QObject *parent)
{
    this->m_mutex = m_mutex;
    this->m_msg = m_msg;
}

void WriteThread::run()
{
    while(1){
        m_mutex->lock();
        static char ch = 'a';
        for(int i = 0; i < 128; i++){
            if(i == 127) {
                m_msg->msg[i] = '\0';
                continue;
            }
            m_msg->msg[i] = ch;
            QThread::msleep(50);
        }
        qDebug() << "WRITE" << m_msg->msg;
        m_mutex->unlock();
        QThread::msleep(1000);
        ch++;
    }

}
cpp 复制代码
#ifndef READTHREAD_H
#define READTHREAD_H

#include <QObject>
#include <QThread>
#include <QMutex>
#include "WriteThread.h"



class ReadThread : public QThread
{
    Q_OBJECT
public:
    explicit ReadThread(QMutex* m_mutex, SHARE_MSG* m_msg, QObject *parent = nullptr);
    void run() override;

private:
    QMutex* m_mutex;
    SHARE_MSG* m_msg;
};

#endif // READTHREAD_H
cpp 复制代码
#include "ReadThread.h"
#include <QDebug>





ReadThread::ReadThread(QMutex *m_mutex, SHARE_MSG *m_msg, QObject *parent):QThread(parent)
{
    this->m_msg = m_msg;
    this->m_mutex = m_mutex;
}

void ReadThread::run()
{
    while(1){
        m_mutex->lock();
        qDebug() << "READ" << m_msg->msg;
        m_mutex->unlock();
        QThread::msleep(800);
    }

}
cpp 复制代码
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle(QStringLiteral("test"));


    SHARE_MSG* msg = new SHARE_MSG;
    QMutex* mutex = new QMutex();
    ReadThread* readThread = new ReadThread(mutex,msg, this);
    WriteThread* writeThread = new WriteThread(mutex, msg, this);
    readThread->start();
    writeThread->start();

}
相关推荐
龚建波3 小时前
《QDebug 2026年6月》
qt
ziguo11224 小时前
深入浅出 C/C++ 数据类型:从入门到踩坑
linux·c语言·c++·windows·visual studio
白色冰激凌4 小时前
[SECS/GEM研究] (三)SECS-I 串口上消息怎么分块和重传
c++·secs/gem
光头闪亮亮5 小时前
Fyne ( go跨平台GUI )项目实战-项目开发必备基础知识(中)
android·c++·go
光头闪亮亮5 小时前
Fyne ( go跨平台GUI )项目实战-项目开发必备基础知识(下)
android·c++·go
_wyt0015 小时前
洛谷 P7912 [CSP-J 2021] 小熊的果篮 题解
c++·队列
△曉風殘月〆5 小时前
如何在Linux中安装Qt开发环境
linux·运维·qt
choumin6 小时前
创建型模式——原型模式
c++·设计模式·原型模式·创建型模式
code_pgf7 小时前
C/C++ 常用容器功能汇总
c语言·开发语言·c++
王维同学8 小时前
Credential Provider、Filter 与 PLAP 的 CLSID 枚举
c++·windows·安全·注册表