#include "StdAfx.h"
#include "threadskeleton.h"
#include "04WebServer.h"

CThreadSkeleton::CThreadSkeleton(void)
{
	m_run = 0;
	m_break = 0;
}

CThreadSkeleton::~CThreadSkeleton(void)
{
	EndThread();
}

//	スレッドの開始
int CThreadSkeleton::StartThread()
{
	m_run = 1;

	if(AfxBeginThread(WorkThread,this) != NULL)
		return(0);
	return(-1);
}

//	スレッドの終了・強制終了
void CThreadSkeleton::EndThread()
{
	Break();

	while(m_run)
		Sleep(10);
}

//	中断
void CThreadSkeleton::Break()
{
	m_break = 1;
}

//	実行中か取得
int CThreadSkeleton::IsRunning()
{
	return(m_run);
}

//	中断要求を取得
int CThreadSkeleton::GetBreak()
{
	return(m_break);
}

void CThreadSkeleton::_ThreadMain()
{
#ifndef _DEBUG
	try
	{
#endif

		ThreadMain();

#ifndef _DEBUG
	}
	catch(CMemoryException *err)
	{
		GET_APP()->WriteDebugLog("メモリ不足により、処理スレッドが停止しました。");
		err->Delete();
	}
	catch(CException *err)
	{
		GET_APP()->WriteDebugLog("サーバ内部の未処理MFC例外により、処理スレッドが停止しました。");
		err->Delete();
	}
#endif

}

//	実行関数
UINT CThreadSkeleton::WorkThread(LPVOID pParam)
{
	CoInitialize(NULL);

#ifndef _DEBUG
	__try
	{
#endif
		((CThreadSkeleton*)pParam)->_ThreadMain();
#ifndef _DEBUG
	}
	__except(EXCEPTION_EXECUTE_HANDLER)
	{
		GET_APP()->WriteDebugLog("サーバ内部の未処理例外により、処理スレッドが停止しました。");
	}
#endif
	CoUninitialize();

	((CThreadSkeleton*)pParam)->m_run = 0;
	return(0);
}
