#include "StdAfx.h" #include "WHThread.h" ////////////////////////////////////////////////////////////////////////////////// //结构定义 //启动参数 struct tagThreadParameter { bool bSuccess; //是否错误 HANDLE hEventFinish; //事件句柄 CWHThread * pServiceThread; //线程指针 }; ////////////////////////////////////////////////////////////////////////////////// //构造函数 CWHThread::CWHThread() { //设置变量 m_bRun=false; m_uThreadID=0; m_hThreadHandle=NULL; return; } //析构函数 CWHThread::~CWHThread() { //停止线程 ConcludeThread(INFINITE); return; } //状态判断 bool CWHThread::IsRuning() { //运行检测 if (m_hThreadHandle==NULL) return false; if (WaitForSingleObject(m_hThreadHandle,0)!=WAIT_TIMEOUT) return false; return true; } //启动线程 bool CWHThread::StartThread() { //效验状态 ASSERT(IsRuning()==false); if (IsRuning()==true) return false; //清理变量 if (m_hThreadHandle!=NULL) { //关闭句柄 CloseHandle(m_hThreadHandle); //设置变量 m_uThreadID=0; m_hThreadHandle=NULL; } //变量定义 tagThreadParameter ThreadParameter; ZeroMemory(&ThreadParameter,sizeof(ThreadParameter)); //设置变量 ThreadParameter.bSuccess=false; ThreadParameter.pServiceThread=this; ThreadParameter.hEventFinish=CreateEvent(NULL,FALSE,FALSE,NULL); //效验状态 ASSERT(ThreadParameter.hEventFinish!=NULL); if (ThreadParameter.hEventFinish==NULL) return false; //启动线程 m_bRun=true; m_hThreadHandle=(HANDLE)::_beginthreadex(NULL,0,ThreadFunction,&ThreadParameter,0,&m_uThreadID); //错误判断 if (m_hThreadHandle==INVALID_HANDLE_VALUE) { CloseHandle(ThreadParameter.hEventFinish); return false; } //等待事件 WaitForSingleObject(ThreadParameter.hEventFinish,INFINITE); CloseHandle(ThreadParameter.hEventFinish); //判断错误 if (ThreadParameter.bSuccess==false) { ConcludeThread(INFINITE); return false; } return true; } //停止线程 bool CWHThread::ConcludeThread(DWORD dwMillSeconds) { //停止线程 if (IsRuning()==true) { //设置变量 m_bRun=false; //停止等待 if (WaitForSingleObject(m_hThreadHandle,dwMillSeconds)==WAIT_TIMEOUT) { return false; } } //设置变量 if (m_hThreadHandle!=NULL) { //关闭句柄 CloseHandle(m_hThreadHandle); //设置变量 m_uThreadID=0; m_hThreadHandle=NULL; } return true; } //投递消息 LRESULT CWHThread::PostThreadMessage(UINT uMessage, WPARAM wParam, LPARAM lParam) { //状态效验 ASSERT((m_uThreadID!=0)&&(m_hThreadHandle!=NULL)); if ((m_uThreadID==0)||(m_hThreadHandle==NULL)) return false; //投递消息 if (::PostThreadMessage(m_uThreadID,uMessage,wParam,lParam)==FALSE) { DWORD dwLastError=GetLastError(); return dwLastError; } return 0L; } //线程函数 unsigned __stdcall CWHThread::ThreadFunction(LPVOID pThreadData) { //随机种子 srand((DWORD)time(NULL)); //变量定义 tagThreadParameter * pThreadParameter=(tagThreadParameter *)pThreadData; CWHThread * pServiceThread=pThreadParameter->pServiceThread; //启动通知 try { pThreadParameter->bSuccess=pServiceThread->OnEventThreadStrat(); } catch (...) { //设置变量 ASSERT(FALSE); pThreadParameter->bSuccess=false; } //设置事件 bool bSuccess=pThreadParameter->bSuccess; ASSERT(pThreadParameter->hEventFinish!=NULL); if (pThreadParameter->hEventFinish!=NULL) SetEvent(pThreadParameter->hEventFinish); //线程处理 if (bSuccess==true) { //线程运行 while (pServiceThread->m_bRun) { #ifndef _DEBUG //运行版本 try { if (pServiceThread->OnEventThreadRun()==false) { break; } } catch (...) { } #else //调试版本 if (pServiceThread->OnEventThreadRun()==false) { break; } #endif } //停止通知 try { pServiceThread->OnEventThreadConclude(); } catch (...) { ASSERT(FALSE); } } //中止线程 _endthreadex(0L); return 0L; } //////////////////////////////////////////////////////////////////////////////////