www.pudn.com > ChatUseIOCP.rar > DtThread.cpp


#include "StdAfx.h" 
#include "dtthread.h" 
 
Datatal::DtThread::DtThread(void) 
{ 
	m_bThreadRunning = false; 
	m_hThread = NULL; 
	m_nThreadId = 0; 
	m_hStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL); 
} 
 
Datatal::DtThread::~DtThread(void) 
{ 
	if (m_bThreadRunning)  
		StopThread(); 
 
	CloseHandle(m_hStopEvent); 
	m_hStopEvent = NULL; 
} 
 
 
DWORD Datatal::DtThread::StartThread() 
{ 
	//First of all, check if the thread is already running. 
	m_CritThread.Lock(); 
	if (m_bThreadRunning) 
	{ 
		OnThreadLogWrite(1, "ClientSocket::Start(), Thread is running, doing nothing."); 
		m_CritThread.Unlock(); 
		return 1; 
	} 
 
     
	m_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)InternalThreadFunc, this, NULL, (LPDWORD)&m_nThreadId); 
	if (!m_hThread)  
	{ 
		//failure 
		m_nThreadId = 0; 
		OnThreadLogWrite(3, "CSocketFront::Start(1) fails because threadpointer wasn't retrieved."); 
		m_CritThread.Unlock(); 
		return 2; 
	} 
 
	m_CritThread.Unlock(); 
	char szLog[128]; 
	sprintf(szLog, "Thread(%X) have been started", m_nThreadId); 
	OnThreadLogWrite(3, szLog); 
	return 0; 
} 
 
unsigned __stdcall Datatal::DtThread::InternalThreadFunc(void* pClient) 
{ 
	DtThread* pThreadClient = (DtThread*)pClient; 
 
	//pThreadClient->OnThreadRunning(); 
 
	pThreadClient->m_CritThread.Lock(); 
	pThreadClient->m_bThreadRunning = true; 
	pThreadClient->m_CritThread.Unlock(); 
 
	pThreadClient->OnThreadLogWrite(3, "Thread has been started."); 
	pThreadClient->ThreadFunc(pThreadClient->m_hStopEvent); 
	pThreadClient->OnThreadLogWrite(3, "Thread has been stopped."); 
 
	pThreadClient->m_bThreadRunning = false; 
	pThreadClient->OnThreadStopped(); 
	return 0; 
} 
 
//Stop thread 
DWORD Datatal::DtThread::StopThread() 
{ 
 
	//Check if the thread is running 
	m_CritThread.Lock(); 
	if (!m_hThread) 
	{ 
		m_CritThread.Unlock(); 
		return 1; 
	} 
 
 
	// Signal the thread to die. 
	SetEvent(m_hStopEvent); 
 
	char szLog[128]; 
	sprintf(szLog, "Thread(%X) was signalled to stop.", m_nThreadId); 
	OnThreadLogWrite(2, szLog); 
 
	if (WaitForSingleObject(m_hStopEvent, 1000) == WAIT_TIMEOUT) 
	{ 
		sprintf(szLog, "Thread(%X) signalling failed, using TerminateThread.", m_nThreadId); 
		OnThreadLogWrite(1, szLog); 
 
		// Terminate thread 
		if (!TerminateThread(m_hThread, 0)) 
		{ 
			OnThreadLogWrite(1, "TerminateThread failed."); 
			m_CritThread.Unlock(); 
			return 2; 
		} 
	} 
 
	if (!m_bThreadRunning && m_hThread) 
	{ 
		CloseHandle(m_hThread);	 
		m_hThread = NULL; 
	} 
 
	ResetEvent(m_hStopEvent); 
 
	m_CritThread.Unlock(); 
	return 0; 
}