217 lines
3.8 KiB
C++
217 lines
3.8 KiB
C++
#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;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////
|