メンバ関数をスレッド関数にしたいのですが,
CreateTHreadかんすうの3番目の引数(関数へのポインタ)
の型が違うとはじかれます。
どうすればコンパイルできますか?
下に動かなかったサンプルをのせました.
class CThreadBase{
private:
HANDLE hthread;
DWORD threadID;
int ThreadFunc(int par){
cout << func : << par << endl;
return 0;
}
public:
CThreadBase(){
hthread = NULL;
}
~CThreadBase(){}
int StartThread(){ // a constructor for thread
// initialization process
if(hthread == NULL){
hthread = CreateThread(
NULL,
0,
(LPTHREAD_START_ROUTINE) ThreadFunc,
5,
0,
&threadID
);
}
return 0;
}
int StopThread(){
TerminateThread(hthread,0);
hthread = NULL;
return 0;
}
};
int main(int argc, char* argv[]){
CThreadBase th;
th.StartThread();
Sleep(1000);
th.StopThread();
return 0;
}
はじめまして、おきゅとぱすというものです。
結論から言うとCreateThreadの引数にクラスのメンバ関数を指定することはできません。
そもそも、引数が違ってしまいます。
というのは、クラスのメンバ関数ではthisポインタが暗黙のうちに、
引数の1つとして渡されてしまうからです。
どうしてもメンバ関数を渡したいのなら
static関数にすればCreateThreadにも渡すことができます。
もちろん、このときはthisポインタが必要になるようなメンバへの参照はできません。
といったところでどうでしょうか?
適切なアドバイスありがとうございました。
言われたとおり、引数の問題でした。
ついでに、メンバ変数の参照にはスレッド関数の引数に
thisポインタを指定してやれば
this->m_メンバ
のように参照することができます。