VCのクラスの中でスレッドを使う
今回の忙しい中で初めて気がついたのだけど、クラス中でスレッドを立ち上げようと思うと意外と面倒。なぜかというと、
start_address
新規スレッドの実行を起動するルーチンの開始アドレス。_beginthread の呼び出し規約は __cdecl または __clrcall で、_beginthreadex の呼び出し規約は __stdcall または __clrcall です。
だから。そうするとアクセスしたいメンバ変数をスタティックにしないといけなくなって、本末転倒というか、かなり面倒(逃げ方はいろいろ思いつくけど、ダサイ)と、いうことで探してみると、vNull Blogが参考になる。サンプルソースを転載しておくと、
class Hoge{ public: static unsigned int WINAPI Thread(void*); unsigned int _Thread(void); }; unsigned int WINAPI Hoge::Thread(void *obj) { return reinterpret_cast<Hoge*>(obj)->_Thread(); } unsigned int Hoge::_Thread(void) { //通常のスレッド用プログラミング } /* そして、仮にクラスのインスタンスとしてHoge obj;としている場合、 _beginthreadexの第4引数として&objを与えればよい。仮に呼び出し元が クラスのメンバ関数であればthisを与えればよい。 */
とのこと。今までやったこと無かったのは結構不思議なんだよな。主にメインの中からスレッドを起こすことが多かったからかな?