Qt学习(九):QT中使用线程

12 篇文章 2 订阅

知识点

  • 大量的数据处理任务放到子线程里面
  • 线程创建
  • 线程回收
  • 线程处理函数内部,不允许操作图形界面
  • 子线程处理一个死循环任务,通过改变标志位,让其退出死循环
  • 子线程处理结束后,发送一个delDone信号让其主线程捕捉,触发槽函数

完整项目github地址:

https://github.com/taw19960426/Qt_study/tree/main/QThread

结果演示

在这里插入图片描述

线程创建流程图

在这里插入图片描述

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QThread>

#include <QDebug>
#define cout qDebug() << "[" << __FILE__ <<":" << __LINE__ << "]"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    myThread=new MyThread(this);//线程创建

    //通过set函数设置标志位 默认为假
    myThread->setIsStop(false);

    //get获取私有成员
    bool ans=myThread->getStopValue();
    cout<<ans;
    //cout<<myThread->isStop;//直接获取不到


    connect(&myTimer,&QTimer::timeout,this,&Widget::delTimer);

    //线程任务结束后返回delDone信号,关闭定时器
    connect(myThread,&MyThread::delDone,this,&Widget::myThreadDone);

    //关闭主窗口时线程退出
    //当按窗口右上角x时,窗口触发destroyed()
    connect(this,&Widget::destroyed,this,&Widget::killMyThread);

}

void Widget::killMyThread(){
    //关闭主窗口,让线程结束任务
    myThread->setIsStop(true);
    //停止线程
    myThread->quit();
    //等待线程处理完手头动作
    myThread->wait();
    cout<<"关闭主窗口,线程资源回收";
}

void Widget::delTimer(){
    static int i = 0;

    ui->lcdNumber->display(i);
    i++;
}

void Widget::myThreadDone(){

    //关闭定时器
    cout<<"线程处理结束,关闭定时器";
    myTimer.stop();
}

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

void Widget::on_pushButton_clicked()
{
    //如果定时器没有激活,才启动
    if(!myTimer.isActive()){
          myTimer.start(20);
      }

    if(myThread->isRunning()){
        return;
    }

//    //需要处理复杂的任务
//    QThread::sleep(5);

//    myTimer.stop();

    //启动线程
    myThread->start();
}


void Widget::on_buttonClose1_clicked()
{
    if(!myThread->isRunning()){
        return;
    }
    //cout<<"555555555";
    //通过标志位结束线程死循环,让线程发出delDone()信号
    myThread->setIsStop(true);
    Widget::myThreadDone();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTimer>
#include "mythread.h"

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_pushButton_clicked();

    void on_buttonClose1_clicked();

private:
    Ui::Widget *ui;

    QTimer myTimer;

    MyThread *myThread;


private:
    void delTimer();//定时器槽函数
    void myThreadDone();//线程结束处理槽函数
    void killMyThread();//窗口关闭 线程退出
};

#endif // WIDGET_H

mythread.cpp

#include "mythread.h"
#include <QDebug>

MyThread::MyThread(QObject *parent) :
    QThread(parent)
{
    isStop=false;


}

void MyThread::run(){
    //线程处理函数
    //很复杂的数据处理
    //需要耗时5s
    //sleep(5);
    while (!isStop) {
        sleep(1);
        qDebug() << "子线程号:" << QThread::currentThread();

        //通过标志位来跳出循环
        if(isStop){
            break;
        }
    }

    //处理完以后发出结束信号
    emit delDone();
}

bool MyThread::getStopValue(){

    return isStop;
}

void MyThread::setIsStop(bool flag){
    isStop=flag;
}

mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>

class MyThread : public QThread
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = 0);

public:
    //get set函数必须公有public
    bool getStopValue();
    //通过set函数设置标志位 默认为假
    void setIsStop(bool flag=false);

private:
    //QThread的虚函数
    //线程处理函数
    //不能直接调用,通过start()间接调用
    void run();

    bool isStop;

signals:
    void delDone();

public slots:

};

#endif // MYTHREAD_H

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐维康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值