Qt中使用线程之QRunnable

1、自定义1个子类继承自QRunnable

2、重写run方法,编写子线程的业务逻辑

3、使用QThreadPool的全局方法来开启这个线程

4、线程的回收不需要关注,由QThreadPool处理

5、缺点:无法使用信号槽机制

6、适合一些不需要和主线程通信的耗时的任务

举例:

窗口创建时开启1个耗时任务,打印ui线程和任务线程的id,任务线程被销毁时,打印日志

cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QRunnable>
#include<QThread>
#include<QThreadPool>

//继承自QRunnable
class MyThread:public QRunnable
{
public:
    MyThread()=default;
    ~MyThread()
    {
        qDebug()<<"我被销毁了";
    }

    //提供退出方法
    void Stop()
    {
        stop=true;
    }

protected:
    //重写run方法
    void run() override
    {
        qDebug()<<"子线程id:"<<QThread::currentThreadId();
        int num=0;
        while(!stop)
        {
            //num自增,然后循环打印
            qDebug()<<num++;
            QThread::msleep(1000);
        }
    }
private:
    bool stop=false;

};



class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr) : QWidget(parent)
    {
        qDebug()<<"UI线程iD:"<<QThread::currentThreadId();

        //创建任务
        th=new MyThread;
        //使用QThreadPool的全局实例来启动任务
        QThreadPool::globalInstance()->start(th);
        //子线程的释放不需要我们来管了
    }
    ~Widget(){
        //窗口销毁时,停止掉子线程的耗时任务
        th->Stop();
    };
private:
    MyThread* th;
};
#endif // WIDGET_H
相关推荐
苏克贝塔1 小时前
Qt 图形视图框架3-事件处理与传播
c++·qt
轩情吖1 小时前
Qt的信号与槽(二)
数据库·c++·qt·信号·connect·信号槽·
胖大和尚1 小时前
C++项目学习计划
开发语言·c++·学习
GiraKoo3 小时前
【GiraKoo】 C++20的新特性
c++
无聊的小坏坏3 小时前
力扣 239 题:滑动窗口最大值的两种高效解法
c++·算法·leetcode
黎明smaly3 小时前
【排序】插入排序
c语言·开发语言·数据结构·c++·算法·排序算法
CCF_NOI.3 小时前
(普及−)B3629 吃冰棍——二分/模拟
数据结构·c++·算法
byxdaz4 小时前
QT并发机制
qt
眠りたいです5 小时前
Mysql常用内置函数,复合查询及内外连接
linux·数据库·c++·mysql
雨落倾城夏未凉5 小时前
7.QObject定时器和QTimer定时器的区别
后端·qt