スレッドクラス
C++でWin32APIをラップしたようなライブラリを作ってるんだけど、スレッド機能の実装にて。
- スレッドを開始するには_beginthreadex関数を使用する
- 主な引数は呼び出す関数の開始アドレスとそれに渡す引数(
void*型)
で、関数は__stdcall呼び出し規約である必要があって、戻り値がunsigned、引数がvoid*である必要がある。
そして重要なのは「仮想関数はアドレスが取れない」という事実。
ま、仮想関数が使いたければこんな風にやるわけだ。
classThread {public:virtual~Thread() {}voidstart();virtualvoidrun() =0;private:staticunsigned__stdcall run_(void*); };voidThread::start() {// thisポインタをreinterpret_castしてrun_に渡す_beginthreadex(0,0, run_,reinterpret_cast<void*>(this),0,0); }unsigned__stdcall Thread::run_(void* that) {// ポインタを戻すThread* thread =reinterpret_cast<Thread*>(that); thread->run(); _endthreadex(0);return0; }
これでめでたく問題解決。
あとはこのクラスを継承して、run関数をオーバーライドして、start関数を呼び出せば・・・
そう、Java風なスレッドクラスですね。
ちなみに
http://msdn2.microsoft.com/ja-jp/library/kdzttdcb.aspx
で_beginthreadex関数について読めます。