QT创建线程-基于QThread的简单封装

QT线程简介

QT平台实现了一个QThread类用于创建线程,官方说明请参考:QThread官方介绍
实际使用中可能需要重复执行线程run函数代码段,当前使用方式是单次执行的。在此做了简单封装,方便重复执行/退出run代码部分。

线程封装逻辑

当前增加了一个函数virtual const bool threadFun(void)以及两个构造函数RThead(lambda1)RThead(lambda2)用于实现线程逻辑代码执行。
通过重载虚函数virtual const bool threadFun(void)可自定义代码逻辑,该函数返回true则下次继续执行该函数,返回false则退出线程。
通过构造函数传参lambda表达式也可以实现线程逻辑代码,如果传参的lambda表达式没有返回值则代码逻辑只执行一次;如果有返回值,返回true则继续执行代码逻辑,返回false退出下称。
无论是选择用重载的方式还是传参lambda表达式方式,二者只能选其一。

相关代码

RThead.h

#pragma once
#include <qthread.h>
#include <qmutex.h>

class RThead :
    protected QThread
{
private:
    //构造参数1
    using lambda1 = void (*)(void);
    lambda1 lambdaFun1;
    //构造参数2
    using lambda2 = bool (*)(void);
    lambda2 lambdaFun2;
private:
    /*
    @brife 重写run函数
    */
    void run(void);

protected:
    /*
    @brife 线程执行函数,此函数编写需要执行的逻辑代码
    @return true 继续执行;false 退出函数停止执行
    */
    virtual const bool threadFun(void);

public:
    //默认构造
    RThead();
    //传参无参无返回值函数构造
    RThead(lambda1);
    //传参无参返回true或false函数构造
    RThead(lambda2);

    virtual ~RThead() {};

    /*
    @brife 启动线程
    */
    using QThread::start;

    /*
    @brife 请求退出线程
    */
    using QThread::requestInterruption;

    /*
    @brife 请求退出线程,并等待直至退出
    */
    void requestInterruptionAndWait();

    /*
    @brife 获取线程id
    @return 返回线程id
    */
    static const uint32_t getThreadId(void);
};

RThead.cpp

#include "RThead.h"
#include <thread>  

void RThead::run(void)
{
	forever{
		if (true == isInterruptionRequested() || false == threadFun()){
			return;
		}
	}
}

const bool RThead::threadFun(void)
{
	if (nullptr != lambdaFun1)
	{
		lambdaFun1();
	}

	if (nullptr != lambdaFun2)
	{
		return lambdaFun2();
	}

	return false;
}

RThead::RThead():lambdaFun1(nullptr), lambdaFun2(nullptr)
{
}

RThead::RThead(lambda1 fun) : lambdaFun1(fun), lambdaFun2(nullptr)
{
}

RThead::RThead(lambda2 fun) : lambdaFun1(nullptr), lambdaFun2(fun)
{
}

void RThead::requestInterruptionAndWait()
{
	//请求退出
	requestInterruption();
	//等待退出
	forever{
		if (true == isFinished()) { return; }
	}
}

const uint32_t RThead::getThreadId(void)
{
	return *(uint32_t*)&std::this_thread::get_id();
}

main.cpp

#include <QtCore/QCoreApplication>
#include <QDebug>

#include "RThead.h"

namespace
{
    class MyThread : public RThead {
        /*
        @brife 线程执行函数,此函数编写需要执行的逻辑代码
        @return true 继续执行;false 退出函数停止执行
        */
        const bool threadFun(void)
        {
            qDebug() << "overload threadFun," << "thread id:" << RThead::getThreadId();
            //只执行一次,因此return false
            return false;
        }
    };
    static MyThread thread1;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    RThead thread2([] {qDebug() << "thread id:" << RThead::getThreadId(); });
    RThead thread3([] {
        QThread::msleep(100);
        static int count = 0; 
        qDebug() << "count:" << count << "\tthread id:" << RThead::getThreadId();
        return (3 > ++count) ? true : false; });

    thread1.start();
    thread2.start();
    thread3.start();

    return a.exec();
}

执行结果

QThread类分装执行结果

工程源码

此工程环境为VS2019+QT5.14。如果不能直接运行,也可以拷贝相关代码到当前环境运行。
源码工程链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值