【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 小时前
LRU Cache
c++·缓存
UIU1143 小时前
P1003 [NOIP 2011 提高组] 铺地毯
数据结构·c++·算法
xxwl5854 小时前
区域赛算法模版第四章---数据结构
数据结构·c++·算法
余额瞒着我当琳6 小时前
哈希表底层原理解析,直接定址法,哈希冲突,负载因子,哈希函数,开放定址法
java·c++·哈希算法·散列表
xxwl5856 小时前
区域赛算法模版第五章---数学与数论
c++·笔记·算法
Quz6 小时前
QML TabBar 标签栏交互效果合集
qt·动画·qml
局部有解6 小时前
LeetCode Hot100 438 找到字符串中所有字母异位词
c++·算法·leetcode
David猪大卫7 小时前
【C++修炼】string类:string类的模拟实现
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
WL学习笔记8 小时前
模板初阶(C++)
开发语言·c++·后端·模板初阶
埃伊蟹黄面8 小时前
面试常问题目 —— STL
c++·面试·职场和发展·stl