Files
2026-02-13 14:34:15 +08:00

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;
}
//////////////////////////////////////////////////////////////////////////////////