服务核心 - 线程类

代码对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返回失败,那么线程执行结束;

时间: 2024-10-19 14:13:46

服务核心 - 线程类的相关文章

服务核心 - 工具类

虽然类名称为CWHService,我理解更多的是工具函数. 主要接口功能有: 1)SetClipboardString设置字符串到windows剪贴板 2)GetMachineID获取机器标识,网卡地址MD5加密: 3)GetMachineIDEx获取机器标识,网卡地址和硬盘信息MD5加密: 4)RegisterHotKey与UnRegisterHotKey为注册热键和注销热键: 5)GetWorkDirectory获取进程所在路径: 6)GetModuleVersion获取软件版本信息: 7)

[Java聊天室服务器]实战之四 线程类

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

核心线程池的内部实现(读书笔记)

对于核心的几个线程池,无论是newFixedThreadPool()方法,newSingleThreadExecutor()还是newCachedThreadPool()方法,虽然看起来创建的线程有着完全不同的功能特点,但其内部实现均使用了ThreadPoolExecutor实现,下面给出了三个线程池的实现方式. public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecut

WPF核心对象模型-类图和解析

DispatcherObject是根基类,通过继承该类,可以得到访问创建该对象的UI线程的Dispatcher对象的能力.通过Dispatcher对象,可以将代码段合并入该UI线程执行. DependencyObject是核心基类,用于实现依赖属性机制.依赖属性是一个比CLR属性更强大的属性模型,该模型支持更改通知,默认值继承等特性,并能减少属性存储空间.DependencyObject通过GetValue和SetValue等方法支持依赖属性机制.继承该类的几个下一层基类Visual,Visua

第十三章 进程、线程类的实现

                                        第十三章   进程.线程类的实现         多线程是指在一个进程内可以同时运行多个任务,每个任务由一个单独的线程来完成.线程是进程运行的基本单位,一个进程中可以同时运行多个线程.如果程序被设置为多线程方式,可以提高程序运行的效率和处理速度. 多个线程共用一个进程的资源:进程的调度.切换是在10ms的"时钟滴答"定时中断程序里进行.如果一个线程获得CPU,那么在下一个Tick到来前:是不可能被切换出去的

Delphi 实现多线程编程的线程类 TThread

http://blog.csdn.net/henreash/article/details/3183119 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到, 但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchronize的用法就完了. 然而这并不是多线程编程的全部,我写此文的目的在于对此作一个补充. 线程本质上是进程中一段并发运行的代码. 一个进程至少有一个线程,即所谓的主线程. 同时还可以有多个

转:学习笔记: Delphi之线程类TThread

学习笔记: Delphi之线程类TThread - 5207 - 博客园http://www.cnblogs.com/5207/p/4426074.html 新的公司接手的第一份工作就是一个多线程计算的小系统.也幸亏最近对线程有了一些学习,这次一接手就起到了作用.但是在实际的开发过程中还是发现了许多的问题,比如挂起与终止的概念都没有弄明白,导致浪费许多的时间. TThread-简单的开始 在Delphi的VCL中封装了一个TThread类用于多线程的开发,这样比较符合面向对象的思想,同时又可以提

停止基于服务的线程

停止基于服务的线程 应用程序通常会创建拥有服务的线程, 比如线程池. 这些服务的存在时间通常要比创建他们的方法存在的时间更长, 如果应用程序优雅的退出了,这些服务的线程也需要结束.因为没有退出线程惯用的优先方法, 他们需要自行结束. 明智的封装实践指出,你不应该操控某个线程一一中断它,改变他的优先级,等等... 除非是这个.线程的拥有者, 线程API没有关于线程所属权正规的概念. 线程通过一个Thread对象表示,和其他对象一样可以被自由的共享. 但是, 认为线程有一个拥有者是有道理的. 这个拥

Delphi中线程类TThread 实现多线程编程

作者:Rogee出处:Http://Rogee.cnblogs.com/心得:BLOG是什么,它是一个记录学习过程的东西 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchronize的用法就完了.然而这并不是多线程编程的全部,我写此文的目的在于对此作一个补充. 线程本质上是进程中一段并发运行的代码.一个进程至少有一个线程,即所谓的主线程.同时还可以