VisualC++のワーカースレッドからメンバ変数へアクセスする方法

web上にもあちこちで掲載されてはいますが…。


ダイアログアプリケーションとかでワーカースレッドを走らせて*1スレッド内でダイアログ内の部品を更新させる処理を行う場合。
ワーカースレッドを呼び出す際に次の様に書く。

AfxBeginThread(ThreadPrcs, this);

これで、呼ばれるThreadPrcs関数はおそらく次の様な形になる。
例えば、ダイアログがCFooDlgというクラスで定義されていた場合、

UINT ThreadPrcs(LPVOID p)
{
    CFooDlg* pDlg = (CFooDlg*)(p);
    CString strTxt;
    for(int count=0; count<100; count++){
       Sleep(3000);                               // ものすごく重い処理。
       strTxt.Format("%d回目の重い処理", count);
       pDlg->m_strMessage = strTxt;
    }
}

これでメンバ変数にアクセスでき、変数を更新することが出来る。

*1:そもそも、コレが余り好ましくない実装方法なのかもしれないが