UIスレッドからメインウィンドウに描画する方法

[戻る]
ひぃ 2005/09/15(木) 15:10:50
今、VS.NETのMFCを使用してUIスレッドのプログラムを作成しています。
そこで質問なのですが、
CWinThreadを継承した自作クラスから、メインウィンドウ(CEditView)に文字を描画する
にはどうしたらよいのでしょうか?
ご教授お願い致します。

後、スレッド内部でウィンドウに描画する処理を持たせても良いのかも教えてくださ
い。

環境:
WinXP
VS.NET2003
MFC
CEditViewを派生させたSDI

PATIO 2005/09/15(木) 17:53:21
普通は描画するべき内容と描画指示をメインウインドウに通知して
メインウインドウに描画させると思います。
スレッド間での大きなデータのやり取りはグローバルのポインタを通してでも
行う事ができますから必要なら排他処理を施した上でサブスレッドから
メインスレッドに描画指示を出し、受けたメインスレッド側で内容を参照して
描画と言う方法も取れると思います。
方法的には他にもあると思いますので調べてみてはどうでしょうか。
基本的にスレッドを跨って直接操作するような事はしないと思います。
Microsoftはスレッドを跨いだウインドウクラスのインスタンスのやり取りは
するべきでないと公言していますから、今現在のMFCの実装でうまく行ったとしても
将来にわたって保障されていないと考えるべきだと思います。

ひぃ 2005/09/20(火) 23:16:23
PATIOさん、返事遅れてしまって申し訳御座いません。
描画に関しては描画内容をメインスレッドに渡す方法を考えて見ます。
追加で質問なのですが、通信を行なう処理(accept,recv,send)をサブスレッドで処理さ
せようと思っているのですが、このとき使用するのは、ワーカースレッドかUIスレッド
のどちらが適切なのですか?

実際に考えている処理は、サブスレッド内で、無限ループを実行して、常に
accept→recv→sendを行なおうとしています。
その時、メインスレッドはブロッキングなどの影響を受けないようにしようとしています。

よろしくお願いします。

PATIO 2005/09/21(水) 11:47:04
なんか同じような質問を他の掲示板でも見たような気がしますが、
皆まで言いません。
投稿された掲示板全てにきちんとレスをつけて処理していただければ。

私的にはUIが必要でないのであれば、UIスレッドは使いません。
UI関連の処理は全てメインスレッドに任せて、UIが要らない部分をワーカースレッド化
する場合がほとんどです。(そうしないと出来ないとは言いませんが)
通信用のワーカースレッドとUIを担当するメインスレッドとの間で情報をやり取りする
方法を決めてしまえば何とでもなるような気がします。
以前にやっていた方法ですが、メインスレッドとワーカースレッド間でやり取りする為の
共有データクラスを作成してこれに排他処理も含めて行わせるようにし、このクラスの
インスタンスをグローバルに作成します。
通信用のワーカースレッドからの通知はウインドウメッセージを使いました。
スレッド間の同期は同期オブジェクトを使えば可能だと思いますし、
ワーカースレッドからの通知だけならウインドウメッセージを使う手もあります。
あとは、通信中に新たな通信が発生しないようにGUI側をブロックしたり、
通信中ならユーザーのオペレーションを無視したりする仕組みを入れます。
通信要求をキューに積んでおけるような仕組みを考えれば、ある程度は先行入力も出来そ
うですが、
必要ないならそこまで複雑化するのもどうかと思いますし。

一意見として参考にしていただければよろしいかと。

ひぃ 2005/09/21(水) 22:21:39
[[解決]]
PATIOさん、助言有難う御座います。
色々と内部の処理などを考えてワーカースレッドで作成することにしました。
サブスレッド内部でソケットクラスを作成後に無限ループの通信処理を行なっています。
しかし、終了処理が中途半端なため、メモリリークを出している状態なので、もう少し勉
強して作成していきます。
スレッドに関してはまるっきり知識がなかったんですが、教えていただいたことを参考に
しながら、これからも勉強していきます。

本当に有難う御座いました。

古いスレッドには追加発言できません。