• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++封装线程类的实现方法

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++创建线程,c++多线程,c++线程,c++多线程编程,c++多线程编程实例等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文实例讲述了C++封装线程类的实现方法。分享给大家供大家参考。具体方法如下:

#define WM_CUTTERSTART WM_USER + 100    // wParam == xxx  lParam==xxxx 
 
/* 
外面调用这个类时,只需要IsRunning() Startxxx(xxx) Suspendxxx()   Resumexxx() Stopxxx() 
*/ 
 
/* 
m_bContinue在真正的工作代码DoSomething中检测,在退出和类析构时设为FALSE,在Reset时和构造时设为TRUE  标志内部是否继续工作 
m_bRunning  在Startxxx Suspendxxx Resumexxx 中检测,在构造时和Reset时设为FALSE,在_ThreadEntry得到WaitForSingleObject时设为TRUE 
            外部通过IsRunning得到是否正在运行 
 
*/ 
class CMyClass 
{ 
public: 
    // 工作退出代码 
    enum ExitCode{  
        exitSuccess,    // 成功完成任务 
        exitUserForce,  // 用户终止 
        exitError,  // 源文件出错 
    }; 
 
    // 构造函数 
    CMyClass(HWND hWndNotify); //接收窗口句柄 
 
    // 属性 对外开放 
    BOOL IsRunning() const { return m_bRunning; }  //对外 
 
    // 操作  对外开放 
    BOOL Startxxx(xxx); 
    BOOL Suspendxxx(); 
    BOOL Resumexxx(); 
    void Stopxxx(); 
 
    // 具体实现 
public: 
    ~CFileCutter(); //析构 
 
protected: 
    // 重置参数信息和状态标志 
    void Reset(); 
    // 真正的工作核心代码 
    void DoSomething(); 
 
    // 工作线程 
    UINT friend _ThreadEntry(LPVOID lpParam); 
 
    // 状态标志 
    BOOL m_bContinue;   //  是否继续工作 DoSomething中检测,如果在DoSomething中不m_bContinue,就中止工作 
    BOOL m_bRunning;    //  是否处于工作状态 
 
    // 同步以上两组数据 
    CRITICAL_SECTION m_cs;  // Data gard 
 
private: 
    // 对象的生命周期全局有效的数据 
    HWND m_hWndNotify;  // 接受消息通知事件的窗口句柄 
    HANDLE m_hWorkEvent;    // 通知开始工作的事件对象句柄 
    CWinThread* m_pThread;  // 工作线程 
    BOOL m_bSuspend;    // 暂停标志 
    BOOL m_bExitThread; // 退出标志 
}; 
 
//构造 
CMyClass::CMyClass() 
{ 
    // 初始化全局有效变量 
 
    m_hWndNotify = hWndNotify; 
    m_bExitThread = FALSE; 
    m_bSuspend = FALSE; 
    // 创建等待事件对象 
    m_hWorkEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL); 
    // 创建工作线程 
    m_pThread = AfxBeginThread(_CutterEntry, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED, NULL); 
    m_pThread->m_bAutoDelete = FALSE; 
    m_pThread->ResumeThread(); 
 
    // 初始化工作期间有效变量 
    m_bContinue = TRUE;  //工作函数不被打断,这个标志就为TRUE,在工作函数中检测这个值 
    m_bRunning  = FALSE;  //线程函数在WaitForSingleObject,所以还是FALSE 
    // 创建关键代码段 
    ::InitializeCriticalSection(&m_cs);  
} 
 
// 内部工作线程 
UINT _ThreadEntry(LPVOID lpParam) 
{ 
    // 得到CMyClass对象的指针 
    CMyClass* pMyClass = (CMyClass*)lpParam; 
 
    // 循环处理用户的工作请求 
    while(::WaitForSingleObject(pMyClass->m_hWorkEvent, INFINITE) == WAIT_OBJECT_0 &&  
        !pMyClass->m_bExitThread) 
    { 
        // 设置状态标志,说明正在工作 
        ::EnterCriticalSection(&pCutter->m_cs); 
        pMyClass->m_bRunning = TRUE; 
        ::LeaveCriticalSection(&pCutter->m_cs); 
 
        // 开始真正的工作 
        pMyClass->DoSomething() 
 
        // 准备接受新的工作任务 
        pMyClass->Reset(); //这个函数中设置一下各标志的值 
    } 
 
    return 0; 
} 
 
void CMyClass::Reset() 
{ 
    ::EnterCriticalSection(&m_cs); 
 
    // 重置状态标志 
    m_bContinue = TRUE; 
    m_bRunning = FALSE; 
 
    ::LeaveCriticalSection(&m_cs); 
} 
 
CMyClass::~CMyClass() 
{ 
    // 设置结束标志 
    m_bExitThread = TRUE; 
 
    // 设置强制退出标志 
    ::EnterCriticalSection(&m_cs); 
    m_bContinue = FALSE; 
    ::LeaveCriticalSection(&m_cs); 
 
    //**********很重要****************************************** 
    // 防止线程在m_hWorkEvent事件上等待 
    ::SetEvent(m_hWorkEvent); 
 
    // 确保工作线程结束 
    ::WaitForSingleObject(m_pThread->m_hThread, INFINITE); 
 
    // 释放所有资源 
    ::CloseHandle(m_hWorkEvent); 
    ::DeleteCriticalSection(&m_cs);  
    delete m_pThread; 
} 
 
BOOL CMyClass::Startxxx(xxx) 
{ 
    if(m_bRunning) 
        return FALSE; 
 
    // 通知线程

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • c++实现简单的线程池
  • c++线程池实现方法
  • c++实现简单的线程池
  • C++封装线程类的实现方法
  • C++设置事件通知线程工作的方法
  • 基于C++实现的线程休眠代码
  • C++线程池的简单实现方法
  • c++版线程池和任务池示例
  • 解析C/C++中如何终止线程的运行

相关文章

  • 2017-05-28C/C++常用函数易错点分析
  • 2017-05-28内联函数inline与宏定义深入解析
  • 2017-05-28C++中赋值运算符与逗号运算符的用法详解
  • 2017-05-28c++ 指针与引用的区别介绍及使用说明
  • 2017-05-28C 语言常用方法技巧
  • 2017-05-28详解次小生成树以及相关的C++求解方法
  • 2017-05-28c++如何分割字符串示例代码
  • 2017-05-28C++二分查找(折半查找)算法实例详解
  • 2017-05-28C++表达式new与delete知识详解
  • 2017-05-28有关C++中随机函数rand() 和srand() 的用法详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 详解C++中二进制求补运算符与下标运算符的用法
    • 详解C++编程中对于函数的基本使用
    • C++ 中滚动条的滚动问题
    • 深入解读C++中的指针变量
    • 冒泡排序的三种实现方法
    • C++中结构体的类型定义和初始化以及变量引用
    • cf 304 Soldier and Traveling 网络流 + 记录流量情况
    • c++关键字mutable深入解析
    • linux之awk命令的用法
    • C语言 文件的随机读写详解及示例代码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有