アプリ版:「スタンプのみでお礼する」機能のリリースについて

MFCマルチスレッドについて
COMやIOボードからの入力に応じて動作するアプリを作っています。
AfxBeginThreadにてそれぞれワーカスレッドを作成しCOMやIOから入力があれば
AfxBeginThreadを呼んでいるクラスにあるメンバ関数を実行しようとしています。
AfxBeginThreadにて*thisを送り、制御関数内で、mycls->OnButton***()というような
感じで現在は作っています。(OnButton***になっているのはデバッグ用にボタンで
あらかじめ作成している関数のためです。)
このときに、mycls->OnButton***()は親スレッドで動いていると考えていいのですか?
あくまで親スレッドのクラスのメンバ関数を制御関数が動いている子スレッドで実行
しているだけなのでしょうか?
実は、ログ表示のため制御関数の中(受信データを表示)と、mycls->OnButton***()の中
(作業結果を表示)に同じエディットコントロールへの表示部分があります。
表示部分の処理は、いったんCStringで読み込んできて最大文字数チェックを行い、
再度文字数を調節して書き直しということをやっているため、一応クリティカル
セクションにはしているのですが、実際どう動いているか分からないため、やり忘れ
ていることや、やってはいけないことをやってそうです。
すいませんがご教授願います。

A 回答 (2件)

>AfxBeginThreadにて*thisを送り、制御関数内で、mycls->OnButton***()というような


感じで現在は作っています。

この方法なら、
「親スレッドのクラスのメンバ関数を制御関数が動いている子スレッドで実行しているだけ」
になります。

ここで問題になりそうなのは、
1.同じ関数を別々のスレッドが実行することになるので、同期処理が必要になるかもしれない。
2.親スレッドがウィンドウプロシ-ジャを実行している場合、子スレッドからは親スレッド所有のウィンドウ操作を行うことはできない。

1に関してはクリティカルセクションで保護しているようなのでよさそうですが、2に関しては、親スレッドがウィンドウを所有している上に再度表示をしなおすということなので、問題になるかもしれません。

表示に関わるコードがある場合は、その部分をメッセージハンドラとして実装し、子スレッドから#1さんが挙げているSendMessage、PostMessageなどを利用して親スレッドに実行させる方がよいかと思います。

この回答への補足

皆さんありがとうございます。
ネットで探してみると、
http://www.wit-systems.co.jp/MultiTh01.htm
のようなページもありやはりメッセージで処理したほうが良さそうでしたので
組み替えて今のところ何も起こらず動いています。
ありがとうございました。

補足日時:2010/06/02 14:14
    • good
    • 0

SendMessageやPostMessageなどでボタンクリックイベントなどを飛ばしているなら


処理されるのはメインのスレッドになりますが
質問のように直にメンバー関数読んでいるのであれば
実行はそのスレッド内で行われるはずです
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!