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