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

本文实例讲述了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; 
 
    // 通知线程开始工作 
    ::SetEvent(m_hWorkEvent); 
    return TRUE; 

 
BOOL CMyClass::Suspendxxx() 

    if(!m_bRunning) 
        return FALSE; 
 
    // 暂停工作线程 
    if(!m_bSuspend) 
    { 
        m_pThread->SuspendThread(); 
        m_bSuspend = TRUE; 
    } 
    return TRUE; 

 
BOOL CMyClass::Resumexxx() 

    if(!m_bRunning) 
        return FALSE; 
 
    // 唤醒工作线程 
    if(m_bSuspend) 
    { 
        m_pThread->ResumeThread(); 
        m_bSuspend = FALSE; 
    } 
    return TRUE; 

 
void CMyClass::Stopxxx() 

    // 设置强制退出标志 
    ::EnterCriticalSection(&m_cs); 
    m_bContinue = FALSE; 
    ::LeaveCriticalSection(&m_cs); 
 
    // 防止线程处于暂停状态 
    ResumeCutter(); 

 
//-------------------------实现代码-------------------------// 
 
//真正的工作代码 
void CMyClass::DoSomething() 

    // 通知用户,出错 
    ::PostMessage(m_hWndNotify, wm_xxx, exitError, 0); 
 
    // 通知用户,开始工作 
    ::PostMessage(m_hWndNotify, WM_XXXSTART, 0, XX); 
     
    // 首先判断是否要求终止执行 
    if(!m_bContinue) 
    { 
        //释放资源 
        xxxx; 
 
        if(!m_bExitThread) 
            ::PostMessage(m_hWndNotify, WM_XXXXSTOP, XX, XX); 
        return; 
    } 
    // 通知用户,工作完成 
    ::PostMessage(m_hWndNotify, WM_CUTTERSTOP, exitSuccess, nCompleted); 
}

希望本文所述对大家的C++程序设计有所帮助。

(0)

相关推荐

  • C++ 线程(串行 并行 同步 异步)详解

    C++  线程(串行 并行 同步 异步)详解 看了很多关于这类的文章,一直没有总结.不总结的话就会一直糊里糊涂,以下描述都是自己理解的非官方语言,不一定严谨,可当作参考. 首先,进程可理解成一个可执行文件的执行过程.在ios app上的话我们可以理解为我们的app的.ipa文件执行过程也即app运行过程.杀掉app进程就杀掉了这个app在系统里运行所占的内存. 线程:线程是进程的最小单位.一个进程里至少有一个主线程.就是那个main thread.非常简单的app可能只需要一个主线程即UI线程.

  • C++实现多线程查找文件实例

    主要是多线程的互斥 文件 的查找 多线程互斥的框架 复制代码 代码如下: //线程函数  UINT FinderEntry(LPVOID lpParam)  {      //CRapidFinder通过参数传递进来       CRapidFinder* pFinder = (CRapidFinder*)lpParam;      CDirectoryNode* pNode = NULL;      BOOL bActive = TRUE; //bActive为TRUE,表示当前线程激活   

  • C++程序中启动线程的方法

    C++11 引入一个全新的线程库,包含启动和管理线程的工具,提供了同步(互斥.锁和原子变量)的方法,我将试图为你介绍这个全新的线程库. 如果你要编译本文中的代码,你至少需要一个支持 C++11 的编译器,我使用的是 GCC 4.6.1,需要使用 -c++0x 或者 -c++11 参数来启用 C++11 的支持. 启动线程 在 C++11 中启动一个线程是非常简单的,你可以使用 std:thread 来创建一个线程实例,创建完会自动启动,只需要给它传递一个要执行函数的指针即可,请看下面这个 Hel

  • C++使用CriticalSection实现线程同步实例

    本文实例讲述了C++使用CriticalSection实现线程同步的方法,在前文C++线程同步实例分析的基础上增加了四行代码,使用了四个函数: EnterCriticalSection ::DeleteCriticalSection ::EnterCriticalSection ::LeaveCriticalSection此时,打印出来的数字就相等了. 具体代码如下: #include "stdafx.h" #include <Windows.h> DWORD g_cnt1

  • C++实现一个线程安全的单例工厂实现代码

      C++实现一个线程安全的单例工厂实现代码 我们见到经常有人用 static 局部对象的方式实现了类似单例模式,最近发现一篇文章明确写明 编译器在处理  static局部变量的时候 并不是线程安全的 !!! http://blogs.msdn.com/b/oldnewthing/archive/2004/03/08/85901.aspx 于是实现了一个单例工厂  并且是线程安全的 #ifndef SINGLETONFACTORY_H #define SINGLETONFACTORY_H #in

  • linux下的C\C++多进程多线程编程实例详解

    linux下的C\C++多进程多线程编程实例详解 1.多进程编程 #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main() { pid_t child_pid; /* 创建一个子进程 */ child_pid = fork(); if(child_pid == 0) { printf("child pid\n"); exit(0); } else { print

  • 老生常谈C++的单例模式与线程安全单例模式(懒汉/饿汉)

    1 教科书里的单例模式 我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的动作由一个public的类方法代劳,该方法也返回单例类唯一的实例. 上代码: class singleton { protected: singleton(){} private: static singleton* p; public: static singleton* instance()

  • c++实现简单的线程池

    这是对pthread线程的一个简单应用 1.      实现了线程池的概念,线程可以重复使用. 2.      对信号量,互斥锁等进行封装,业务处理函数中只需写和业务相关的代码. 3.      移植性好.如果想把这个线程池代码应用到自己的实现中去,只要写自己的业务处理函数和改写工作队列数据的处理方法就可以了. Sample代码主要包括一个主程序和两个线程实现类 ThreadTest.cpp:主程序 CThreadManager:线程管理Class,线程池的实现类 CThread:线程Class

  • 从C++单例模式到线程安全详解

    先看一个最简单的教科书式单例模式: class CSingleton { public: static CSingleton* getInstance() { if (NULL == ps) {//tag1 ps = new CSingleton; } return ps; } private: CSingleton(){} CSingleton & operator=(const CSingleton &s); static CSingleton* ps; }; CSingleton*

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

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

  • 详解SpringMVC 自动封装枚举类的方法

    springmvc默认无法自动封装枚举类,解决方法如下: 1.枚举类 public enum GoodsPromoteEnum { /** * 0 精品 */ fine("精品",0), /** * 1 限时购 */ limit("限时购",1), /** * 2 特价 */ cheap("特价",2); private String value; private int index; private GoodsPromoteEnum(Strin

  • C++封装IATHOOK类实例

    本文实例讲述了C++封装IATHOOK类的实现方法.分享给大家供大家参考.具体方法如下: 1. 定义成类的静态成员,从而实现自动调用 复制代码 代码如下: static CAPIHOOK sm_LoadLibraryA;  static CAPIHOOK sm_LoadLibraryW;  static CAPIHOOK sm_LoadLibraryExA;  static CAPIHOOK sm_LoadLibraryExW;  static CAPIHOOK sm_GetProcAddres

  • Java线程创建与Thread类的使用方法

    目录 1.线程与Thread类 1.1操作系统中的线程与Java线程 1.1.1线程与Thread类 1.1.2Thread类的构造方法 1.1.3启用java线程必会的方法 1.2第一个Java多线程程序 1.3使用Runnable对象创建线程 1.4使用内部类创建线程 1.5使用Lambda表达式创建线程 1.6多线程并发执行简单演示 1.7多线程并发执行的优势 2.Thread类的常用属性与方法 2.1Thread类中的重要属性 2.2Thread类中常用方法总结 2.2.1常用方法 2.

  • python GUI库图形界面开发之PyQt5线程类QThread详细使用方法

    QThread是Qt的线程类中最核心的底层类.由于PyQt的的跨平台特性,QThread要隐藏所有与平台相关的代码 要使用的QThread开始一个线程,可以创建它的一个子类,然后覆盖其它QThread.run()函数 class Thread(QThread): def __init __(self): super(Thread,self).__ init __() def run(self): #线程相关的代码 pass 接下来创建一个新的线程 thread = Thread() thread

  • php封装db类连接sqlite3数据库的方法实例

    前言 SQLite3扩展名在PHP 5.3.0+以上都会默认启用.可以在编译时使用--without-sqlite3来禁用它. Windows用户可通过启用php_sqlite3.dll才能使用此扩展. php_sqlite3.dll默认包含在PHP 5.3.0之后的PHP发行版中. 有关详细的安装说明,请查看PHP教程及其官方网站. 本文主要介绍了关于php封装db类连接sqlite3的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 示例代码: <?php clas

  • C#线程定义和使用方法详解

    一.C# Thread类的基本用法 通过System.Threading.Thread类可以开始新的线程,并在线程堆栈中运行静态或实例方法.可以通过Thread类的的构造方法传递一个无参数,并且不返回值(返回void)的委托(ThreadStart),这个委托的定义如下: [ComVisibleAttribute(true)] public delegate void ThreadStart() 我们可以通过如下的方法来建立并运行一个线程. 复制代码 代码如下: using System;  u

  • C#创建线程带参数的方法

    1.无参数线程的创建 Thread thread = new Thread(new ThreadStart(getpic)); thread.Start(); private void showmessage() { Console.WriteLine("hello world"); } 2.带一个参数的线程 使用ParameterizedThreadStart,调用 System.Threading.Thread.Start(System.Object) 重载方法时将包含数据的对象传

  • Python自定义线程类简单示例

    本文实例讲述了Python自定义线程类.分享给大家供大家参考,具体如下: 一. 代码 # -*- coding:utf-8 -*- #! python2 import threading class mythread(threading.Thread): def __init__(self, num): threading.Thread.__init__(self) self.num = num def run(self): print('I am {0}'.format(self.num))

  • python3中的logging记录日志实现过程及封装成类的操作

    作用: 主要记录信息,便于定位查看问题. python logging模块官网: https://docs.python.org/zh-cn/3.7/library/logging.html#formatter-objects 三种定位问题方法: print debug调试:代码写好后,就不需要再进行调试了,所以引入了logger logging.debug() – 一般在测试环境中用 logger:当生产环境中有问题时,可以查看logger定位问题 步骤: 1.初始化日志 收集器 2.设置日志

随机推荐