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();
}
执行结果
工程源码
此工程环境为VS2019+QT5.14。如果不能直接运行,也可以拷贝相关代码到当前环境运行。
源码工程链接