服务核心 - 线程类

代码对windows线程进行了很好的抽象,用面向对象的思想进行了封装,用户只用重点关注三个函数:

1、OnEventThreadRun          --线程运行函数

2、OnEventThreadStrat        --线程开始事件

3、OnEventThreadConclude  --线程结束事件

 

对象声明

 1 //线程对象
 2 class SERVICE_CORE_CLASS CWHThread
 3 {
 4     //状态变量
 5 private:
 6     volatile bool                    m_bRun;                                //运行标志
 7 
 8     //线程变量
 9 private:
10     UINT                            m_uThreadID;                        //线程标识
11     HANDLE                            m_hThreadHandle;                    //线程句柄
12 
13     //函数定义
14 protected:
15     //构造函数
16     CWHThread();
17     //析构函数
18     virtual ~CWHThread();
19 
20     //接口函数
21 public:
22     //获取状态
23     virtual bool IsRuning();
24     //启动线程
25     virtual bool StartThread();
26     //终止线程
27     virtual bool ConcludeThread(DWORD dwMillSeconds);
28 
29     //功能函数
30 public:
31     //线程标识
32     UINT GetThreadID() { return m_uThreadID; }
33     //线程句柄
34     HANDLE GetThreadHandle() { return m_hThreadHandle; }
35     //投递消息
36     LRESULT PostThreadMessage(UINT uMessage, WPARAM wParam, LPARAM lParam);
37 
38     //事件函数
39 protected:
40     //运行事件
41     virtual bool OnEventThreadRun() { return true; }
42     //开始事件
43     virtual bool OnEventThreadStrat() { return true; }
44     //终止事件
45     virtual bool OnEventThreadConclude() { return true; }
46 
47     //内部函数
48 private:
49     //线程函数
50     static unsigned __stdcall ThreadFunction(LPVOID pThreadData);
51 };
52 
53 //

对象实现

  1 #include "StdAfx.h"
  2 #include "WHThread.h"
  3 
  4 //
  5 //结构定义
  6 
  7 //启动参数
  8 struct tagThreadParameter
  9 {
 10     bool                            bSuccess;                            //是否错误
 11     HANDLE                            hEventFinish;                        //事件句柄
 12     CWHThread    *                pServiceThread;                        //线程指针
 13 };
 14 
 15 //
 16 
 17 //构造函数
 18 CWHThread::CWHThread()
 19 {
 20     //设置变量
 21     m_bRun=false;
 22     m_uThreadID=0;
 23     m_hThreadHandle=NULL;
 24 
 25     return;
 26 }
 27 
 28 //析构函数
 29 CWHThread::~CWHThread()
 30 {
 31     //停止线程
 32     ConcludeThread(INFINITE);
 33 
 34     return;
 35 }
 36 
 37 //状态判断
 38 bool CWHThread::IsRuning()
 39 {
 40     //运行检测
 41     if (m_hThreadHandle==NULL) return false;
 42     if (WaitForSingleObject(m_hThreadHandle,0)!=WAIT_TIMEOUT) return false;
 43 
 44     return true;
 45 }
 46 
 47 //启动线程
 48 bool CWHThread::StartThread()
 49 {
 50     //效验状态
 51     ASSERT(IsRuning()==false);
 52     if (IsRuning()==true) return false;
 53 
 54     //清理变量
 55     if (m_hThreadHandle!=NULL) 
 56     {
 57         //关闭句柄
 58         CloseHandle(m_hThreadHandle);
 59 
 60         //设置变量
 61         m_uThreadID=0;
 62         m_hThreadHandle=NULL;
 63     }
 64 
 65     //变量定义
 66     tagThreadParameter ThreadParameter;
 67     ZeroMemory(&ThreadParameter,sizeof(ThreadParameter));
 68 
 69     //设置变量
 70     ThreadParameter.bSuccess=false;
 71     ThreadParameter.pServiceThread=this;
 72     ThreadParameter.hEventFinish=CreateEvent(NULL,FALSE,FALSE,NULL);
 73 
 74     //效验状态
 75     ASSERT(ThreadParameter.hEventFinish!=NULL);
 76     if (ThreadParameter.hEventFinish==NULL) return false;
 77 
 78     //启动线程
 79     m_bRun=true;
 80     m_hThreadHandle=(HANDLE)::_beginthreadex(NULL,0,ThreadFunction,&ThreadParameter,0,&m_uThreadID);
 81 
 82     //错误判断
 83     if (m_hThreadHandle==INVALID_HANDLE_VALUE)
 84     {
 85         CloseHandle(ThreadParameter.hEventFinish);
 86         return false;
 87     }
 88 
 89     //等待事件。等待OnEventThreadStrat事件执行结束
 90     WaitForSingleObject(ThreadParameter.hEventFinish,INFINITE);
 91     CloseHandle(ThreadParameter.hEventFinish);
 92 
 93     //判断错误。如果OnEventThreadStrat返回失败,那么结束线程。
 94     if (ThreadParameter.bSuccess==false)
 95     {
 96         ConcludeThread(INFINITE);
 97         return false;
 98     }
 99 
100     return true;
101 }
102 
103 //停止线程
104 bool CWHThread::ConcludeThread(DWORD dwMillSeconds)
105 {
106     //停止线程
107     if (IsRuning()==true)
108     {
109         //设置变量。停止OnEventThreadRun事件执行
110         m_bRun=false;
111 
112         //停止等待
113         if (WaitForSingleObject(m_hThreadHandle,dwMillSeconds)==WAIT_TIMEOUT)
114         {
115             return false;
116         }
117     }
118 
119     //设置变量
120     if (m_hThreadHandle!=NULL)
121     {
122         //关闭句柄
123         CloseHandle(m_hThreadHandle);
124 
125         //设置变量
126         m_uThreadID=0;
127         m_hThreadHandle=NULL;
128     }
129 
130     return true;
131 }
132 
133 //投递消息
134 LRESULT CWHThread::PostThreadMessage(UINT uMessage, WPARAM wParam, LPARAM lParam)
135 {
136     //状态效验
137     ASSERT((m_uThreadID!=0)&&(m_hThreadHandle!=NULL));
138     if ((m_uThreadID==0)||(m_hThreadHandle==NULL)) return false;
139 
140     //投递消息
141     if (::PostThreadMessage(m_uThreadID,uMessage,wParam,lParam)==FALSE)
142     {
143         DWORD dwLastError=GetLastError();
144         return dwLastError;
145     }
146 
147     return 0L;
148 }
149 
150 //线程函数
151 unsigned __stdcall CWHThread::ThreadFunction(LPVOID pThreadData)
152 {
153     //随机种子
154     srand((DWORD)time(NULL));
155 
156     //变量定义
157     tagThreadParameter * pThreadParameter=(tagThreadParameter *)pThreadData;
158     CWHThread * pServiceThread=pThreadParameter->pServiceThread;
159 
160     //启动通知
161     try
162     {
163         pThreadParameter->bSuccess=pServiceThread->OnEventThreadStrat(); 
164     } 
165     catch (...)
166     {
167         //设置变量
168         ASSERT(FALSE);
169         pThreadParameter->bSuccess=false;
170     }
171 
172     //设置事件
173     bool bSuccess=pThreadParameter->bSuccess;
174     ASSERT(pThreadParameter->hEventFinish!=NULL);
175     if (pThreadParameter->hEventFinish!=NULL) SetEvent(pThreadParameter->hEventFinish);
176 
177     //线程处理
178     if (bSuccess==true)
179     {
180         //线程运行
181         while (pServiceThread->m_bRun)
182         {
183 #ifndef _DEBUG
184             //运行版本。如果OnEventThreadRun运行失败,那么退出线程,结束循环。
185             try
186             {
187                 if (pServiceThread->OnEventThreadRun()==false)
188                 {
189                     break;
190                 }
191             }
192             catch (...)    { }
193 #else
194             //调试版本
195             if (pServiceThread->OnEventThreadRun()==false)
196             {
197                 break;
198             }
199 #endif
200         }
201 
202         //停止通知
203         try
204         { 
205             pServiceThread->OnEventThreadConclude();
206         } 
207         catch (...)    { ASSERT(FALSE); }
208     }
209 
210     //中止线程
211     _endthreadex(0L);
212 
213     return 0L;
214 }
215 
216 //

这里有几个注意点:

1、hEventFinish用于控制OnEventThreadStrat是否执行结束;

2、OnEventThreadStrat启动返回失败,那么线程执行结束;

3、m_bRun用于控制是否进入OnEventThreadRun执行,为false,退出循环,线程执行结束;

4、OnEventThreadRun返回失败,那么线程执行结束;

转载于:https://www.cnblogs.com/99code/p/5773688.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值