C++线程类封装实例

最简单的C++ 线程封装 实现了各个平台下的线程封装,只需要继承这个基类,实现一个Run方法,就可以实现对象化的线程类,支持Windows Linux MAC 立即下载

先上代码:

class Thread : NoCopy{
    Thread():_quit(false), _isRunning(false){}
    vartual ~Thread(){}

    int start(bool isJoin = false){    //默认是detach模式
        if(_isRunning){
            return -1;        
        }
        
                _quit = false;
#ifdef SUPPORT_CPLUSPLUS11
        std::thread thd(&Thread::work_thread, this);

        if (isJoin) {
            thd.join();
        } else {
            thd.detach();
        }

#else
        int ret = pthread_create(&_thread_t, NULL, work_thread, (void*)this);

        if (ret != 0) {
            return -2;
        }

        if (isJoin) {
            void* threadResult = 0;
            ret = pthread_join(_thread_t, &threadResult);

            if (ret != 0) {
                return -3;
            }
        } else {
            ret = pthread_detach(_thread_t);

            if (ret != 0) {
                return -4;
            }
        }

#endif
        return 0;
    }

    bool isQuit() const{
        _qiut = true;

        if(isWaiting){
            while(_isRunning){
                msleep(10);
            }        
        }
    }

    bool isRunning() const {
        return _isRunning;
    }

    static void msleep(int ms) {
#ifdef SUPPORT_CPLUSPLUS11
        std::this_thread::sleep_for(std::chrono::milliseconds(ms));
#else
        usleep(ms * 1000);
#endif
    }

protected:
    //必须被子类实现
    virtual void run() = 0;

private:
#ifdef SUPPORT_CPLUSPLUS11
    void work_thread() {
        _isRunning = true;
        run();
        _isRunning = false;
    }
#else
    static void* work_thread(void* param) {
        Thread* pThis = (Thread*)param;
        pThis->_isRunning = true;
        pThis->run();
        pThis->_isRunning = false;
    }
#endif

private:
#ifdef SUPPORT_CPLUSPLUS11
    std::atomic<bool> _quit;

    std::atomic<bool> _isRunning;
#else
    volatile bool _quit;

    volatile bool _isRunning;

    pthread_t _thread_t;
#endif
};

用法示例:

class myThread:public Thread{
public:
    myThread(){}
    ~myThread(){}

protected:
    void run(){
        while(!isQuit()){
            //do something
        }
    }

};


int main(){
    myThread thread;
    thread.start();

    thread.quit(true);//可以选择是否等待线程结束,默认是等待     

}

 

基于深度学习的茶叶等级检测识别系统:YOLOv8 + UI界面 + 数据集完整实现 随着深度学习技术的不断进步,基于计算机视觉的茶叶等级检测系统可以大大提高检测效率,提供客观一致的评估标准。本系统将利用YOLOv8进行茶叶等级的检测与识别,通过图形用户界面(UI)实现与用户的交互,提供茶叶等级分类的实时反馈。本文将详细介绍如何使用YOLOv8结合UI界面,建立一个完整的茶叶等级检测与识别系统,包括数据集的准备、模型的训练、UI的设计及完整的代码实现。本系统的目标是通过深度学习技术,结合YOLOv8模型和图形用户界面(UI),实现对茶叶等级的自动化检测与识别。 阅读详情

相关推荐

Solidworks在Windows 11上安装失败?这里有解决方案

通过上述步骤,你应该能够解决在Windows 11上安装Solidworks时遇到的问题。这个方法通过调整注册表的设置,提高了安装程序的权限,从而有效避免了安装过程中的权限障碍。当然,每个系统的具体情况可能有所不同,如果在尝试上述方法后仍然无法解决问题,建议联系Solidworks的技术支持团队,获取更专业的帮助。希望本文能够对你有所帮助,祝你工作顺利,设计无忧!

nntxthml的博客 4912

c++11 std::thread多线程简单模型

c++11 std::thread的使用介绍(带简单模型的代码参考)

Vis_Stu的专栏 961

TCN+iTransformer时间序列预测实战:从风电功率预测到源码解析(附完整代码)

本文深入探讨了TCN与iTransformer融合模型在时间序列预测,特别是风电功率预测中的应用。通过解析iTransformer‘倒置’视角的创新架构与TCN强大的局部时序捕捉能力,文章提供了完整的融合方案设计、源码实现及实战调优经验,旨在构建更强大的下一代预测引擎。

weixin_29062671的博客 265

C/C++开发,无可避免的多线程(篇五).实现自己的线程封装类

C/C++开发,无可避免的多线程(篇四).实现自己的线程封装类,如何基于c++98的pthread_t封装线程类,如何基于c++11标准库的std::thread封装线程类,并与c++98的版本保持一致,最后将两个版本的线程类合成一个线程版本mythread,给出实现过程、演示结果及源代码。

技术需要分享 1939

数据中心——Vxlan基本概念1

东西流量指的就是横向流量-------例如:服务器与服务器之间交换流量南北流量指的就是纵向流量-------例如:客户端和服务器之间的流量以下主要是讲解业务平面的网络架构(一般业务平面就需要用到专用的数据中心交换机)

m0_49864110的博客 1万+

手把手教你搞定爱思唯尔LaTeX投稿:从模板到PDF生成的全流程避坑指南

本文详细介绍了使用LaTeX投稿爱思唯尔期刊的全流程避坑指南,包括模板选择、文件结构规范、投稿系统文件上传策略、PDF生成与检查等关键步骤。特别强调了避免常见错误如宏包冲突、图片丢失和参考文献问题,并提供了投稿后的应急方案和高阶自动化校验脚本,帮助研究者顺利完成投稿。

weixin_42525289的博客 510

C++线程的封装

线程封装

qq_31231915的博客 985

ShardingSphere-JDBC-若依框架集成(SpringBoot)

ShardingSphere基础知识、ShardingSphere-JDBC如何集成进若依框架中 使用的是若依框架前后端版本、动态数据源,可自行切换,默认数据源为达梦8代理端,

编程小菜鸟的笔记 8168

封装一个C++的线程类

封装一个C++的线程类

weixin_44797811的博客 1169

VisualStudio2022配置CGAL

vs2022和vs2017安装配置boost没什么区别,只需要注意boost的msvc得是14.3的,这玩意跟visualstudio版本挂钩的。压缩包解压,得到下面这两文件,然后把auxiliary这个文件挪到CGAL-5.6里面就行了。我用cgal读取一个stl模型,并输出相关信息(想可视化的话需要安装Qt,不想装Qt也可以装VTK)然后下载下面这两个压缩包。照着下面的截图填就完事了。

weixin_43850909的博客 1171

Python趣学篇:用Pygame打造绚烂流星雨动画

这是一个基于Pygame开发的流星雨动画项目,具有以下特效:🌠多彩流星:8种不同颜色的流星随机生成,每颗都有独特的轨迹✨粒子尾迹:每个流星都带有动态的粒子拖尾效果,增强视觉冲击力🌟闪烁星空:150颗背景星星营造真实的夜空氛围🌌渐变背景:深蓝到黑色的自然渐变,模拟夜空色彩💫斜向轨迹:所有流星都以30-60度角自然斜向下运动🎨中文显示:完美支持中文字体,显示"斜向流星雨来啦!"等文字整个程序运行流畅,达到60FPS的丝滑体验,让你仿佛置身于真实的流星雨之中!

Code_流苏:在代码中寻诗意,在实践中觅真知 6060

一个封装好的线程类

一个封装好的线程类 一.创建线程函数 常用的创建线程的函数是CreateThread,还有MFC中的AfxBeginThread方法.另一种函数是_beginthreadex, 其实它在内部调用了CreateThread,在调用之前_beginthreadex做了很多的工作,从而使得它比CreateThread更 安全.所以一般使用_beginthreadex来创建线程.于是以下使用_beginthreadex函数来创建线程类. 二.线程类示例 1.Thread.h文件如下: #ifndef _THREAD

weixin_43587848的博客 244

京东前端200道面试题及参考答案(中)

前端优化是“提升用户体验、降低资源消耗”的核心手段,需围绕“用户感知的性能指标”(如页面加载速度、交互流畅度)展开,覆盖加载优化、渲染优化、代码优化、网络优化、缓存优化、性能监控六大维度,每个维度下有具体可落地的措施,同时需结合项目实际场景(如单页应用、电商首页)选择优化方案。分页组件需通过props接收“数据总量、当前页、每页条数”等基础信息,通过emit触发“页码切换、每页条数变化”的回调(供父组件请求对应页数据),同时定义默认值确保兼容性。核心Props与Emit设计<template>

大模型大数据攻城狮的专栏 590

c++ 线程类 linux,C++封装线程类的实现方法

本文实例讲述了C++封装线程类的实现方法。分享给大家供大家参考。具体方法如下:// 给主窗口的通知消息#define WM_CUTTERSTART WM_USER + 100 // wParam == xxx lParam==xxxx/*外面调用这个类时,只需要IsRunning() Startxxx(xxx) Suspendxxx() Resumexxx() Stopxxx()*//...

weixin_33836754的博客 303

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C++ - 简化线程调用的好方法 - 传递类普通成员函数指针给线程作为参数

以前启动线程, 每个启动线程的地方都要写好多句话. 唯一不同的地方是要执行的类静态成员函数不同.明显有很多的多余代码实现, 感觉很不好.正好昨天, 做了sqlite3回调函数的改进(sqlite - sqlite3_exec - c++回调函数的处理).里面用到了给回调函数传递类普通成员函数的指针, 和如何用在类回调函数中使用参数中传入的类实例指针调用函数参数传进来的类普通成员函数指针.今天想对启动线程的代码, 也做类似的处理.弄了2个小时, 搞定了.

博客标题不能为空 1359

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

使用C++11的function/bind组件封装Thread以及回调函数的使用

之前在http://www.cnblogs.com/inevermore/p/4008572.html中采用面向对象的方式,封装了Posix的线程,那里采用的是虚函数+继承的方式,用户通过重写Thread基类的run方法,传入自己的用户逻辑。 现在我们采用C++11的function,将函数作为Thread类的成员,用户只需要将function对象传入线程即可,所以Thread的声明中,应...

weixin_34307464的博客 241

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++多线程编程

C++的多线程不同于C语言的多线程,对于我这个从C转向C++的来说更是觉得很难理解;来新公司的这段时间也是一直在思考这方面的事情,近期一直在检查程序中死锁的问题;就总结以下最近对于C++多线程编程的心得吧。 C++的多线程主要体现在两方面,一方面是对于全局数据的线程同步。我们看下面的实例 首先我们封装一个Thread类 Thread.h文件 Vie...

weixin_34095889的博客 80

Windows API一日一练(43)WaitForSingleObject函数

上面已经介绍怎么样创建一个简单的线程,在那里就需要使用函数WaitForSingleObject,它是用来做什么的呢?其实它是用来实现等待线程结束的,它的机理是这样的,通知Windows操作系统,现在我进入睡眼状态,当我关注的对象条件是否满足,如果满足了就吵醒我。在那里关注的对象是线程是否退出,这是一个条件测试。如果不等待线程关闭,就去删除线程的资源,就会出错的。使用前面的线程是简单一些,但它不合

裸奔的蜗牛的专栏 561

2022-07-27 C++并发编程(二)

线程归属权转移,在C++中,线程只可移动不可拷贝,有明确归属权。线程只支持移动,不支持拷贝,这是很容易理解的,也就是所谓的所有权转移,读者可简单练习体会。

老林的博客 300

08面向对象编程风格

1.Thread类图 2.代码 Thread.h #ifndef _THREAD_H_ #define _THREAD_H_ #include class Thread { public: Thread(); virtual ~Thread(); void Start(); void Join(); void SetAutoDelete(bool autoDelete)

INGNIGHT的专栏 357

基于对象风格的线程类封装

基于对象风格的编程思想和面向对象的编程思想不同。面向对象使用纯虚函数为派生类提抽象接口,是一种抽象类(实现回调);而基于对象使用具体类,在类里面通过注册函数实现回调;若是C风格的编程思想,则是定义全局的注册函数指针。 基于对象风格的线程类封装代码如下: 类头文件://start from the very beginning,and to create greatness //@author:

缱绻的西格玛 721

4.自定义线程

1 #include <iostream> 2 #include <thread> 3 #include <cstdlib> 4 #include <iostream> 5 using namespace std; 6 7 class mythread :public thread 8 { 9 public: ...

weixin_30838921的博客 110

C++线程类的封装

操作系统:ubuntu20.04LTS使用头文件:pthread.h在之前的文章中已经实现了C++不可复制基类和线程同步类的封装,本文章内容实现对线程的封装。

pan_1214_的博客 1098

c++ 线程类

可以看到在 createThread() 成员函数里调用了 pthread_create() 进行线程的创建,而且线程函数是此类的一个 static 函数 startThread(void* arg),为什么是 static 类型函数呢?现在C++11及之后版本已经提供了线程类来使用线程,但我们在编译的时候还是需要添加 -lpthread 链接(也许其线程类实现还是得依赖 pthread 库吧,没看过源码还不清楚),那如果不使用c++提供的线程类,我们在实际项目中是如何封装的线程类呢?

tianyexing2008的博客 1686

C++线程类

C++多线程,C++线程类

AllKillMan的专栏 1610
上一篇: 简述C++中static的几种用法
下一篇: js给input赋值无效的问题
胡撸娃哈哈
博客等级 码龄12年 2粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值