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