www.pudn.com > 221315556.rar > BaseThread.cpp
#include "basethread.h"
CBaseThread::CBaseThread(void)
{
m_lpParam = NULL;
m_hThread = NULL;
m_hExitEvent = NULL;
m_dwThreadId = 0;
}
CBaseThread::~CBaseThread(void)
{
if( ThreadActive() )
{
SafeTerminate( 100 );
}
}
// 线程处理函数
DWORD CBaseThread::ThreadProc(LPVOID lpParam)
{
CBaseThread * pThread = (CBaseThread*)lpParam;
DWORD dwRet;
pThread->OnStart();
dwRet = pThread->Proc( pThread->m_lpParam );
pThread->OnExit();
return dwRet;
}
// 真正的线程处理函数
DWORD CBaseThread::Proc(LPVOID lpParam)
{
printf("还没有\n" );
return 0;
}
// 创建线程
HANDLE CBaseThread::Create(DWORD dwStackSize, LPVOID lpParam, DWORD* pId)
{
m_lpParam = lpParam;
m_hThread = CreateThread( NULL, dwStackSize, ( LPTHREAD_START_ROUTINE )ThreadProc, this, CREATE_SUSPENDED , &m_dwThreadId );
if( m_hThread == NULL )
{
printf( "创建失败!\n");
return NULL;
}
if( pId != NULL )
{
(*pId ) = m_dwThreadId;
}
ResumeThread(m_hThread);
return m_hThread;
}
// 安全退出线程
BOOL CBaseThread::SafeTerminate( DWORD dwWaitTime )
{
if( m_hExitEvent == NULL || m_hThread == NULL )
return FALSE;
SetEvent( m_hExitEvent );
if( WaitForSingleObject( m_hThread, dwWaitTime )==WAIT_TIMEOUT)
{
printf( "Perhaps these will enter dead loop\n");
WaitForSingleObject(m_hThread, INFINITE);
}
//Sleep( dwWaitTime );
return TRUE;
}
VOID CBaseThread::OnStart(void)
{
m_hExitEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
ResetEvent( m_hExitEvent );
printf( "线程开始!!\n" );
return ;
}
VOID CBaseThread::OnExit(void)
{
CloseHandle( m_hExitEvent );
CloseHandle( m_hThread );
m_lpParam = NULL;
m_hThread = NULL;
m_hExitEvent = NULL;
m_dwThreadId = 0;
printf( "线程退出!!\n" );
return ;
}
BOOL CBaseThread::WaitForTerminate(void)
{
WaitForSingleObject( m_hThread, INFINITE );
return 0;
}
// 测试线程是否活跃
BOOL CBaseThread::ThreadActive(void)
{
if( m_hThread == NULL )
{
return FALSE;
}
return (WaitForSingleObject( m_hExitEvent, 0 ) == WAIT_TIMEOUT);
}
// 暴力结束线程
BOOL CBaseThread::Terminate(void)
{
if( !ThreadActive())
return FALSE;
TerminateThread( m_hThread, 0 );
OnExit();
return TRUE;
}