/////////////////////////////
// ECCSkelton
// CANVASクラス定義ファイル
// Copyright (c) August, 2022
//        By Ysama
/////////////////////////////

class CTHREAD
{
public:		//メンバー変数
	HANDLE					m_THandle;	//スレッドのハンドル
	LPTHREAD_START_ROUTINE	m_TProc;	//スレッドの実行関数アドレス
	DWORD 					m_TID; 		//スレッドID

public:		//メンバー関数
	CTHREAD();							//コンストラクター（初期化のみ）
	CTHREAD(LPTHREAD_START_ROUTINE,
    		LPVOID, int, DWORD);		//コンストラクター（Begin()を呼ぶ）
	~CTHREAD();							//デストラクター
	bool Begin(LPTHREAD_START_ROUTINE,
    		LPVOID, int, DWORD);		//スレッドの生成
	int GetPriority();					//プライオリティの取得
	bool SetPriority(int);				//プライオリティの設定
	bool Exit(DWORD);					//スレッドの終了
	bool Terminate(DWORD);				//スレッドの強制終了
};

//コンストラクター（初期化のみ）
CTHREAD::CTHREAD() {

	m_THandle = 0;
	m_TProc = 0;
}

//コンストラクター（Begin()を呼ぶ）
CTHREAD::CTHREAD(LPTHREAD_START_ROUTINE TProc, LPVOID Param,
					int TPriority = THREAD_PRIORITY_NORMAL,
					DWORD TFlags = 0) {

	Begin(TProc, Param, TPriority, TFlags);
}

//デストラクター
CTHREAD::~CTHREAD() {

	Terminate(0);
    CloseHandle(m_THandle);
}

//スレッドの生成
bool CTHREAD::Begin(LPTHREAD_START_ROUTINE TProc, LPVOID Param,
					int TPriority = THREAD_PRIORITY_NORMAL,
					DWORD TFlags = 0) {

	if(m_THandle) {
		MessageBoxW(NULL, L"このThreadは既に作られています。", L"警告", MB_OK | MB_ICONSTOP);
		return FALSE;
	}
	m_TProc = TProc;
	m_THandle = CreateThread(NULL,	//セキュリティ属性（Win95, 98系は無視）
					0,				//既定のスタックサイズ（0は主スレッドと同じになる）
					m_TProc,		//スレッドが実行する関数アドレス(DWORD WINAPI Func(LPVOID))
					Param,			//スレッド関数への引数
					TFlags,			//既定の生成フラグ
					&m_TID);		//スレッドＩＤを返す
	//スレッドが作れたかチェックする
	if(!m_THandle) {
		MessageBoxW(NULL, L"スレッドが作れませんでした", L"エラー", MB_OK | MB_ICONSTOP);
		return FALSE;
	}
	else
		SetThreadPriority(m_THandle, TPriority);
	return TRUE;
}

//プライオリティの取得
int CTHREAD::GetPriority() {

	return GetThreadPriority(m_THandle);
}

//プライオリティの設定
bool CTHREAD::SetPriority(int Priority) {

	return SetThreadPriority(m_THandle, Priority);
}

//スレッドの終了
bool CTHREAD::Exit(DWORD ExitCode) {

	ExitThread(ExitCode);
	bool success = CloseHandle(m_THandle);
	if(success)
		m_THandle = 0;
	return success;
}

//スレッドの強制終了
bool CTHREAD::Terminate(DWORD ExitCode) {

	TerminateThread(m_THandle, ExitCode);
	bool success = CloseHandle(m_THandle);
	if(success)		m_THandle = 0;
	return success;
}
