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

}
相关推荐
水利行业RTU手艺人5 分钟前
RTU固件中的“数据保险箱”——离线数据补发系统设计
c++·stm32·单片机·物联网
凯瑟琳.奥古斯特1 小时前
力扣1009补码解法C++实现
开发语言·c++·算法·leetcode·职场和发展
zh_xuan4 小时前
c++ optional用法
开发语言·c++·optional
hssfscv4 小时前
QT的学习笔记4——QMainWindow、资源文件以及主要控件的介绍
笔记·qt·学习
Let's Chat Coding5 小时前
身份识别、身份认证与授权的区别
c++
鹏易灵6 小时前
C++——8.移动语义初探(移动构造、移动赋值)
开发语言·c++·php
凯瑟琳.奥古斯特6 小时前
力扣1008:前序重建BST
开发语言·c++·算法·leetcode·职场和发展
Alvin's Tech Blog6 小时前
内存泄漏会导致操作系统永久丢失内存吗?它会导致应用程序崩溃吗?
c++·内存管理·内存泄漏
luoyayun3616 小时前
Qt + FFmpeg 音频工具:重采样实现
qt·ffmpeg·重采样
会周易的程序员6 小时前
使用 LuaBridge 封装 C++ 日志库 microLog 为 Lua 模块
c++·物联网·junit·lua·日志·iot·aiot