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

}
相关推荐
倒头就睡的小比特5 天前
算法竞赛C++常用的STL
c++·算法
weilx12345 天前
C++笔记-文件IO-<fcntl.h>
c++
Smileyqp沛沛5 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车5 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光5 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
吞下星星的少年·-·5 天前
C++ 萌新语法入门篇
c++·算法比赛
霍霍的袁5 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
another heaven5 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
程序猿编码5 天前
告别改源码适配模型:纯 C++ 可配置 LLM 推理引擎,全格式全结构兼容
c++·大模型·llm·推理引擎
此生决int5 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++