2010年1月18日月曜日

[WIN]Visual C++ MFCでワーカースレッド関数をクラスメンバにする

スレッドを使用する場合、スレッド化する関数は静的に宣言されている必要があります。
しかし、諸般の事情で動的に生成したり、スレッド内でクラスメンバーにアクセスしたい場合の手法の一つです。もっと楽な方法もあるかもしれませんが...

1)クラスヘッダで、スレッド化する関数をstatic宣言し、実際のスレッドプロセスをpublicで宣言する。
publicメンバーとして、static UINT ThreadProcStub(LPVOID pParam);とする。
また、publicメンバーとしてUINT ThreadProc();と宣言。

2)AfxBeginThread()でスレッド起動するときに、自分自身(this)を引数で渡す。
AfxBeginThread(ThreadProcStub, (LPVOID)this, nPriority);とする。

3)スタブスレッドで渡された引数をキャストし、実際のスレッド関数を呼び出す。
たとえば、次のように記述します。

UINT CThreadProc::ThreadProcStub(LPVOID pParam)
{
    CThreadProc* pProc = (CThreadProc*)pParam;

    if (pProc == NULL)
        return 0;

    return pProc ->ThreadProc();
}

【注意事項】ここに掲載されている内容について引用流用は自由ですが、内容やサンプルに基づくいかなる結果に関して一切の責任を負いません。自己の責任の上でご活用ください。