何処までご自分で調べられましたか?
MSDNにUIスレッドの生成方法についての記述が有りますので
それを参照してみてください。
マルチスレッド UIスレッド MFC
これくらいのキーワードでググれば、でてくると思います。
CWinThreadの派生クラスをCreateして、そのスレッド内でCreateNewFrame()すれば良いの
かな・・・
UIスレッドをマルチスレッド化することになりました。
今回が初めてなのですが、既存の機能には手を加えません。
CWinThreadの派生クラスをCreateして、そのクラスの中でウィンドウを生成します。
既存機能に影響があるのでしょうか?
気をつけることがあれば教えてください。
アバウトで申し訳ありませんが、よろしくお願いいたします。
通常のウインドウ間のやり取りとは違って
別のスレッドになりますからスレッド間でデータのやり取りを
する時にそれを意識して行う必要があるという事だと思います。
既存機能の構成等がわかりませんのでこれ以上は書きようが有りません。
同時に同じデータに対して更新が発生しうる場合等々、
一般的にマルチスレッドで気をつけるべき部分は対応が必要でしょう。
スレッド間でウインドウクラスのポインタのやり取りを行わないのも
ワーカースレッドの場合と変わらないと思います。
排他すべきところは排他しています。
UIスレッドが複数になったからといって、動かなくなるようなことはやっていないつもり
なのですが、
シングルでは動くけど、マルチでは動かないような実装方法ってあるのかと思いまして。
UIスレッドをマルチスレッドで動かす事がないので
確実かといわれると困りますが、
排他をきちんと意識していれば、大丈夫なんじゃないかと
思います。MFCのフレームワークにしても明示的にマルチ
スレッドに非対応と無ければ大丈夫だと思いますし。
私の場合、理屈的にはユーザーが二つの画面を全く同時に
操作すると言うケースは考えにくいのでUIスレッドを
マルチスレッド化する事はほとんどないんです。
そういう意味ではNEOさんの方でやってみてわかった事を
フィードバックしていただけると助かるなぁと言うのが
本音ですね。
>理屈的にはユーザーが二つの画面を全く同時に操作すると言うケースは考えにくいので
私の場合も、「二つの画面を全く同時に操作すると言うケース」ではないのですが、
ある画面から別画面を表示させるときに、表示中の画面の終了を待ってからという仕様が
ありますので、
マルチスレッド化せざるを得ないのでしょうね。
マルチスレッド化について何か役に立つことを発見したら、投稿させていただきます。
ありがとうございました。
> シングルでは動くけど、マルチでは動かないような実装方法ってあるのかと思いまし
て。
いろいろあると思いますよ。以下、一例。
> MFCのフレームワークにしても明示的にマルチ
> スレッドに非対応と無ければ大丈夫だと思いますし。
MSDNの説明自体に「スレッドに非対応」とか明示されていることは少ないと思いますが
明示のないものでも、例えばCWndをむやみに他スレッドに渡したりすると
TLSで嵌ったりすることはあるかと。
# MSさんは、明記されていることは極力互換性を保ってくれますが、
# そうでないことは今後の版で予告なく変わったりすることも多々ありますので、
# 保証できないことは書かれない感じではないでしょうか
ちなみに、KBも「明示」に含まれますか。
( http://support.microsoft.com/kb/147578/en-us)
MFCのマルチスレッドでは多分典型的な奴ですが、
SafeHwndでHWNDを渡すとか、そもそも渡さないですむようにするとか注意が必要で、
ダイやログやMFCが管理しているものも含めて、
「各ウィンドウが *どのスレッドに* 属するか」も重要かと。
ちなみに、SendMessageとか書かれていますが、MFCのCWnd::SendMessgaでしょうか。
それとも::SendMessageでしょうか。いずれにせよCWndには注意した方がいいですよ。
まぁ、色々(MFCの内部実装も含め)気をつけることが増えるので、
短納期で初めてとかいうお話で、MFCをマルチスレッドで動かすなんてのは
やらなくていいならしないが吉だとは思いますが。
# 他のワークアラウンドについては提示済みなので割愛。
# 投稿したらリロードされて解決になってました…。
検討をお祈りします。