/////////////////////////////////////////////////////////////////////////////////
//java と VB.net に似せて作ったMFCスレッドクラス
//
//javaっぽく→Threadクラスを継承して開始
//javaっぽく→Runnableインターフェイスをクラスにして開始
//VB.netっぽく→別スレッドで走らせたいメソッドを渡して開始
//
/////////////////////////////////////////////////////////////////////////////////
//InterruptedException		interruptでthrowされる例外クラス
//Runnable					インターフェイス
//Thread						javaっぽいスレッドを実現させるクラス
//	Thread(Runnable*obj)
//	Thread()
//						
//template <class temp>FuncThread	VB.netっぽいスレッドを実現させるクラス
//	FuncThread(temp*This,void(temp::*Func)())
//
//	bool isAlive;			スレッドが生きているか返します
//	void start(void);		スレッドをスタートします。
//	void sleep(int time);	スレッドをスリープします。interruptが呼ばれたときに例外をthrowします。
//												必ず、interruptを読み出すループには入れてください。
//	void join(void);		スレッドが終了するまで待機します。
//	void interrupt(void);	sleepメソッドに割り込みを発生させます。
//	void run(void){}		スレッドにより実行されるメソッドです。オーバーライドして使用します。
//	void Destroy(void);		破棄メソッドです。
//
//ーーーーーーーjavaっぽい使い方その1ーーーーーーー
//
//"Thread.h"このファイルを取り込みます。
//
//#include "Thread.h"
//
//class thread:public Thread{//Threadクラスを継承します。
//public:
//	void run(void){//runメソッドのオーバーライド
//		try{
//			while(true){
//				TRACE("a");
//				sleep(1000);//interruptを使う場合は必ず必要
//			}
//		}catch(InterruptedException e){}//割り込みinterrupt()が呼ばれた時に例外を捕まえます。
//	}
//};
//
//thread*pT;
//void ***::OnButton1() //スレッドの開始
//{
//pT=new thread();
//pT->start();
//}
//
//void ***::OnButton2() //スレッドの終了
//{
//pT->interrupt();
//}
//
//void ***::OnButton3() //スレッドの破棄
//{
//pT->Destroy();	
//}
//ーーーーーーーjavaっぽい使い方その2ーーーーーーー
//
//Runnableインターフェイスをクラスにして
//ThreadのThread(Runnable*obj)コンストラクタに入れてください。
//
//ーーーーーーーVB.netっぽい使い方ーーーーーーーーー
//
//FuncThread<***Dlg>*t;
//
//void ***Dlg::test()//自分のクラスのメソッドを別スレッドで走らせます。
//{
//	try{
//		while(true){
//			TRACE("a");
//			t->sleep(1000);//interruptを使う場合は必ず必要
//		}
//	}catch(InterruptedException err){}
//}
//
//void ***Dlg::OnButton1() //スレッドの開始
//{
//	t=new FuncThread<***Dlg>(this,this->test);//VC6
//	//t=new FuncThread<***Dlg>(this,test);//VC.net
//	t->start();
//}
//
//void ***Dlg::OnButton2() //スレッドの終了
//{
//	t->interrupt();
//}
//
//void ***Dlg::OnButton3() //スレッドの破棄
//{
//	t->Destroy();
//}
//////////////////////////////////////////////////////////////////////////////////////////

class InterruptedException{};//例外クラス

class Runnable{//インターフェイス
public :
	virtual void run(void)=0;
};

class Thread :public Runnable{
private:
	Runnable*pRobj;
	CWinThread* pThread;
	static UINT ThreadMain( LPVOID pvParam );
	bool bExceptionThrow;
	void init(void);
public :
	Thread(Runnable*obj){init();pRobj=obj;}
	Thread(){init();pRobj=this;};
	~Thread(){}
	bool isAlive;
	void start(void);
	void sleep(int time);
	void join(void);
	void interrupt(void);
	void run(void){}
	void Destroy(void);
};
void Thread::init(void){
	bExceptionThrow=false;
	isAlive=false;
	pThread = AfxBeginThread((AFX_THREADPROC)ThreadMain, 
							(LPVOID)this,      // このクラスをパラメータとして渡しています
							THREAD_PRIORITY_NORMAL,
							0,
							CREATE_SUSPENDED);//スタート時からサスペンド
}

void Thread::Destroy(void){
	delete pRobj;
}
void Thread::start(void){
	isAlive=true;
	pThread->ResumeThread();
}
void Thread::sleep(int time){
	Sleep(time);
	if(bExceptionThrow) throw InterruptedException(); 
}

void Thread::join(void){
	while(isAlive){}
}

void Thread::interrupt(void){
	bExceptionThrow=true;
}
//スレッドのメイン
UINT Thread::ThreadMain(LPVOID pvParam)
{
	((Thread*)pvParam)->pRobj->run();
	((Thread*)pvParam)->isAlive = false;
    return(0);
}

template <class temp> 
class FuncThread :public Thread{
private :
	void(temp::*pFunc)();
	temp*pThis;
public :
	FuncThread(temp*This,void(temp::*Func)()){
		pThis=This;
		pFunc=Func;
	}
	~FuncThread(){}
	void run(void){
		(pThis->*pFunc)();
	}
};



▲トップページ > Windows と C++