吉田です。


> とっちゃんです。

> > > > int CMyThread::ExitInstance()
> > > > {
> > > >   // 終了処理いろいろ
> > > >   m_dlg.DestroyWindow();
> > > >
> > > >   return CWinThread::ExitInstance();
> > > > }
> > > 
> > > ですが、正しくスレッドが作られているとしたら
> > > ExitInstance でダイアログを閉じるのでは遅すぎます。
> > 
> > 上記のコードだと具体的に何がまずいのでしょうか?
> > 私自身、上記のコードでサンプルプログラムを作成してみたのですが、
> > 普通に動作しているように見えます。
> > 
> > 基本的な内容なのかもしれませんが、
> > ご教授いただけないでしょうか?

> 動作上、大きな問題は出ないと思いますよ。
> ただし、それはコードによるんです。

> DestroyWindow を呼び出した後、一切のPostMessage(相当処理)が
> ない場合は問題はありません。

> が、もしひとつでもメッセージキューにポストしてくる動作が
> 行われてしまえば、そのメッセージは処理されずに捨てられる
> ということになります。

> 捨てられても問題がないメッセージであれば問題には
> なりませんが、処理されないと問題があるメッセージであれば
> それが問題となります。

とっちゃんさん、ご回答していただき
ありがとうございました。

私なりに、教えていただいた内容を理解しようとし、
その結果を以下にまとめました。

まず、とっちゃんさんのおっしゃっている
PostMessageの対象(メッセージの送付先)は、
m_dlgのことですよね?
(この時点で間違っていると
以下の内容は意味がなくなるのですが...)

私は、m_dlgを知っているのは、
m_dlgを保持しているCMyThreadのインスタンスだけであり、
そのため、
m_dlgに対してPostMessageできるのは
CMyThreadのインスタンス内からだけだと考えていました。

もしそうであれば、CMyThreadのExitInstance関数内で
m_dlg.DestroyWindow()しても
問題ないということになりますよね?
(m_dlgに対してPostMessageできるのは
CMyThreadインスタンス内からだけであり、
そのインスタンスの終了処理時だから)

でも、実際はm_dlgに対してPostMessageを行うのは
CMyThread以外にもありえるため、
CMyThreadのExitInstance関数内で
m_dlg.DestroyWindow()するのは
よくないということですよね?

ところで、上記のように
CMyThread以外からm_dlgに対して
メッセージが送付されるというのは
どのようなケースが挙げられるのでしょうか?
(m_dlg自身のGUIに対するメッセージハンドラ?
m_dlgの親ウィンドウからのメッセージ?)

以上ですが、私の言おうとしている内容が不明とか、
全く見当違いとか、ここは間違っている等、
いろいろあると思います。
皆様からのご指導、ご指摘をお待ちしております。