Last Updated 2005/01/13
Visual C++ MFC スレッド
スレッドでのCWnd
2005/01/13

MFC にて AfxBeginThread() を使用して,マルチスレッドにする.
しかし,CView 派生クラスへのポインタを渡してそのメンバ関数を呼ぶとアサートされる.

スレッド間で CWnd などを扱うには CWnd のポインタではなく HWND で処理を行う.
MFC の CWnd は上記の様にスレッドセーフなつくりになっておらず,タイミングによっては問題が生じる場合がある.
(多くの場合ポインタ渡しで使用しても問題はない)

MFC はスレッド毎にハンドルと MFC クラスの対応表を保持して,マルチスレッドの場合,この対応表が複数存在することになる.
メインスレッドにて CView 派生クラスの対応がは存在しても,サブスレッドで対応が存在しなければアサートされる.

このことは MSDN にも書いてある.(マルチスレッド : プログラミングのヒント)

HWND を渡して,FromHandle() などを使用して MFC オブジェクトに変換すればよい.


参照
前後のTips
スレッドでのCWnd

DSS ProgrammingTipsCGI Ver1.02