【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();

}
相关推荐
Tyler_TXZ5 小时前
C++C语言之——树
c语言·c++·算法·
旖旎夜光5 小时前
LeetCode 30:串联所有单词的子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
星恒随风5 小时前
C++ 红黑树封装(二):迭代器、const_iterator 与 operator[] 完整实现 mymap 和 myset
开发语言·c++·状态模式
小小龙学IT5 小时前
oneTBB 开源并行编程库深度解析:从工作窃取调度器到 flow graph 实战
c++·开源
ShineWinsu6 小时前
对于C++:缓冲区管理的详细解析
linux·c++·面试·编程·笔试·io·缓冲区
h_a_o777oah7 小时前
【算法基础】卡特兰数:递推定义与折线对称公式推导及解题策略
c++·算法·acm·组合数学·卡特兰数·反射原理·动态规划dp
帅气的小峰7 小时前
pybind11与nanobind可以共存吗?如何迁移?
c++·python·cuda·推理引擎
syker7 小时前
SuperNova Compiler v4.2.9 完整开发手册
c++
zhy295637 小时前
在 QAIRT Genie SDK 上部署 Llama 3.2 1B 模型:从环境准备到 C++ 推理
开发语言·c++·llama
richard_yuu7 小时前
JSON vs XML vs 二进制:3种序列化终极选型
xml·c++·qt·学习·json