Files

217 lines
3.8 KiB
C++
Raw Permalink Normal View History

2026-03-03 13:56:44 +08:00
#include "StdAfx.h"
#include "WHThread.h"
//////////////////////////////////////////////////////////////////////////////////
//<2F><EFBFBD><E1B9B9><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct tagThreadParameter
{
bool bSuccess; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
HANDLE hEventFinish; //<2F>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>
CWHThread * pServiceThread; //<2F>߳<EFBFBD>ָ<EFBFBD><D6B8>
};
//////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><ECBAAF>
CWHThread::CWHThread()
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_bRun=false;
m_uThreadID=0;
m_hThreadHandle=NULL;
return;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CWHThread::~CWHThread()
{
//ֹͣ<CDA3>߳<EFBFBD>
ConcludeThread(INFINITE);
return;
}
//״̬<D7B4>ж<EFBFBD>
bool CWHThread::IsRuning()
{
//<2F><><EFBFBD>м<EFBFBD><D0BC><EFBFBD>
if (m_hThreadHandle==NULL) return false;
if (WaitForSingleObject(m_hThreadHandle,0)!=WAIT_TIMEOUT) return false;
return true;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
bool CWHThread::StartThread()
{
//Ч<><D0A7>״̬
ASSERT(IsRuning()==false);
if (IsRuning()==true) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (m_hThreadHandle!=NULL)
{
//<2F>رվ<D8B1><D5BE><EFBFBD>
CloseHandle(m_hThreadHandle);
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_uThreadID=0;
m_hThreadHandle=NULL;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagThreadParameter ThreadParameter;
ZeroMemory(&ThreadParameter,sizeof(ThreadParameter));
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
ThreadParameter.bSuccess=false;
ThreadParameter.pServiceThread=this;
ThreadParameter.hEventFinish=CreateEvent(NULL,FALSE,FALSE,NULL);
//Ч<><D0A7>״̬
ASSERT(ThreadParameter.hEventFinish!=NULL);
if (ThreadParameter.hEventFinish==NULL) return false;
//<2F><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
m_bRun=true;
m_hThreadHandle=(HANDLE)::_beginthreadex(NULL,0,ThreadFunction,&ThreadParameter,0,&m_uThreadID);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if (m_hThreadHandle==INVALID_HANDLE_VALUE)
{
CloseHandle(ThreadParameter.hEventFinish);
return false;
}
//<2F>ȴ<EFBFBD><C8B4>¼<EFBFBD>
WaitForSingleObject(ThreadParameter.hEventFinish,INFINITE);
CloseHandle(ThreadParameter.hEventFinish);
//<2F>жϴ<D0B6><CFB4><EFBFBD>
if (ThreadParameter.bSuccess==false)
{
ConcludeThread(INFINITE);
return false;
}
return true;
}
//ֹͣ<CDA3>߳<EFBFBD>
bool CWHThread::ConcludeThread(DWORD dwMillSeconds)
{
//ֹͣ<CDA3>߳<EFBFBD>
if (IsRuning()==true)
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_bRun=false;
//ֹͣ<CDA3>ȴ<EFBFBD>
if (WaitForSingleObject(m_hThreadHandle,dwMillSeconds)==WAIT_TIMEOUT)
{
return false;
}
}
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
if (m_hThreadHandle!=NULL)
{
//<2F>رվ<D8B1><D5BE><EFBFBD>
CloseHandle(m_hThreadHandle);
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
m_uThreadID=0;
m_hThreadHandle=NULL;
}
return true;
}
//Ͷ<><CDB6><EFBFBD><EFBFBD>Ϣ
LRESULT CWHThread::PostThreadMessage(UINT uMessage, WPARAM wParam, LPARAM lParam)
{
//״̬Ч<CCAC><D0A7>
ASSERT((m_uThreadID!=0)&&(m_hThreadHandle!=NULL));
if ((m_uThreadID==0)||(m_hThreadHandle==NULL)) return false;
//Ͷ<><CDB6><EFBFBD><EFBFBD>Ϣ
if (::PostThreadMessage(m_uThreadID,uMessage,wParam,lParam)==FALSE)
{
DWORD dwLastError=GetLastError();
return dwLastError;
}
return 0L;
}
//<2F>̺߳<DFB3><CCBA><EFBFBD>
unsigned __stdcall CWHThread::ThreadFunction(LPVOID pThreadData)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
srand((DWORD)time(NULL));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagThreadParameter * pThreadParameter=(tagThreadParameter *)pThreadData;
CWHThread * pServiceThread=pThreadParameter->pServiceThread;
//<2F><><EFBFBD><EFBFBD>֪ͨ
try
{
pThreadParameter->bSuccess=pServiceThread->OnEventThreadStrat();
}
catch (...)
{
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
ASSERT(FALSE);
pThreadParameter->bSuccess=false;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
bool bSuccess=pThreadParameter->bSuccess;
ASSERT(pThreadParameter->hEventFinish!=NULL);
if (pThreadParameter->hEventFinish!=NULL) SetEvent(pThreadParameter->hEventFinish);
//<2F>̴߳<DFB3><CCB4><EFBFBD>
if (bSuccess==true)
{
//<2F>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD>
while (pServiceThread->m_bRun)
{
#ifndef _DEBUG
//<2F><><EFBFBD>а
try
{
if (pServiceThread->OnEventThreadRun()==false)
{
break;
}
}
catch (...) { }
#else
//<2F><><EFBFBD>԰汾
if (pServiceThread->OnEventThreadRun()==false)
{
break;
}
#endif
}
//ֹ֪ͣͨ
try
{
pServiceThread->OnEventThreadConclude();
}
catch (...) { ASSERT(FALSE); }
}
//<2F><>ֹ<EFBFBD>߳<EFBFBD>
_endthreadex(0L);
return 0L;
}
//////////////////////////////////////////////////////////////////////////////////