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