#pragma once

#include "LockObject.h"
#include "TimeOut.h"

/*!
	class CThreadSkeleton

	スレッドのベースです
*/
class CThreadSkeleton
{
protected:
	CCriticalSection	m_scopeLock;

public:
	CThreadSkeleton(void);
	virtual ~CThreadSkeleton(void);

public:
	int StartThread();		//!<	スレッドの開始
	int IsRunning();		//!<	実行中か取得
	void EndThread();		//!<	スレッドの終了・強制終了
	virtual void Break();	//!<	中断
	int GetBreak();			//!<	中断要求を取得

protected:
	virtual void ThreadMain() = 0;	//!<	スレッドの処理
	void _ThreadMain();				//!<	スレッド処理の準備

	CLockObject<int>	m_break;	//!<	中断フラグ
	CLockObject<int>	m_run;		//!<	実行フラグ

	//!	実行クラス名
	char				*m_className;

	//!	実行関数名
	char				*m_functionName;

private:
	static UINT WorkThread(LPVOID pParam);
};

//!	クラス名設定
#define	DEBUG_SET_THREAD_CLASS_NAME(name)	{ m_className = name; };

//!	関数名設定
#define	DEBUG_SET_THREAD_FUNCTION_NAME(name)	{ m_functionName = name; };