#pragma once

//! @file Mix/Thread.h
//! @brief スレッドインクルードファイル

#include "Mix/Noncopyable.h"

namespace Mix{

	//! @class Thread
	//! @brief スレッドクラス
	class _MIX_DLL_API Thread : public Mix::Noncopyable
	{
	private:
		HANDLE m_hThread;
		UInt32 m_ID;
		UInt32 m_SuspendCount;
		void ( *m_pFunc )( void* );
		void* m_pArgument;

	public:
		//! @brief コンストラクタ
		Thread( void );
		//! @brief デストラクタ
		virtual ~Thread( void );

	private:
		static unsigned __stdcall Entry( void* pArg );

	public:
		//! @brief スレッドを開始します
		//! @param[in] pFunc スレッドの実行を起動するルーチンの開始アドレス
		//! @param[in] pArgument スレッドに渡される引数
		//! @param[in] bSuspend True を指定すると、スレッドをサスペンド状態で作成します
		//! @return 成功した場合は True を返します
		Boolean Start( void( *pFunc )( void* ), void* pArgument, Boolean bSuspend = False );
		//! @brief スレッドを終了します
		void Join( void );

		//! @brief スレッドのサスペンドカウントを 1 減らします
		void Resume( void );
		//! @brief スレッドのサスペンドカウントを 1 増やします
		void Suspend( void );
		//! @brief スレッドのサスペンドカウントを取得します
		//! @return スレッドのサスペンドカウント
		UInt32 GetSuspendCount( void ) const;

		//! @brief スレッドIDを取得します
		//! @return スレッドID
		UInt32 GetID( void ) const;
	};

}
