#include"../../Maid/Auxiliary/Thread/CThreadController.h"
#include"../../Maid/Auxiliary/Thread/CThread.h"

#include"../../Maid/Setup/Win32.h"

using namespace Maid;

/*
	複数のスレッドで Cランタイムを使用する場合の注意

	CThreadController.cpp の説明を見ておくこと
	うかつに CThreadController::Pause() を使うと危険なことになります。
*/


unt Func( volatile CThreadController::BRIGEDATA& brige )
{
	while( true )
	{
		if( brige.IsExit     ) { break; }//	終了命令が出たら終了 スレッド駆動させる場合は必ずつけておくこと
		printf( "スレッドメッセージ\n" );
		::Sleep(50);
	}
	return 0;
}


class MemberFunc
{
public:

	void Init()
	{
		counter = 0;
		m_Thread.SetFunc( MakeThreadObject(&MemberFunc::Func, this ) );
		m_Thread.Execute();
	}

	void Final() { m_Thread.Close(); }

private:
	unt Func( volatile CThreadController::BRIGEDATA& brige )
	{
		while( true )
		{
			if( brige.IsExit     ) { break; }//	終了命令が出たら終了 スレッド駆動させる場合は必ずつけておくこと
			printf( "スレッドメッセージ %d \n", counter );
			::Sleep(50);
			++counter;
		}
		return 0;
	}

	int counter;
	CThreadController	m_Thread;
};




class OverwrrideFunc : public IThread
{
protected:
	virtual unt ThreadFunction()
	{
		while( true )
		{
			if( IsExit() ) { break; }

			printf( "メッセージ\n" );
			::Sleep(50);
		}

		return 0;
	}
};









void main()
{
	{	//	ただの関数をスレッド動作させる
		CThreadController hThread;

		//	別スレッドで動作させる関数を設定
		hThread.SetFunc( Func );


		hThread.Execute();	//	これで実行

		::Sleep(1000);

		// スレッドの一時停止
		hThread.Pause();
		::Sleep(2000);

		// スレッドの再開
		hThread.Resume();

		//	hThread のデストラクタで自動的に閉じてくれる。
	}

	printf( "------------\n" );


	{	//	クラスメンバをスレッド動作させる
		//	ほとんどの場合はこれですむはず
		MemberFunc	m;

		m.Init();

		::Sleep(1000);

		//	m.Final();	しなくても t のデストラクタで t.m_Thread のデストラクタが呼ばれて
						//	ちゃんととまってくれる
	}

	printf( "------------\n" );

	{
		//	こっちはあんまり使わないと思う
		OverwrrideFunc	o;

		o.Start();

		::Sleep(1000);

	}

}