/////////////////////////////////////////////////////////////////////////////////
//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++