ユーザインターフェーススレッドを作成するAfxBeginThreadでは、パラメタで指定した
クラスのインスタンスを作るということでしょうか?
それを終了する場合のPostQuitMessageやAfxEndThreadのスレッド終了とExitInstanceの
インスタンス終了では意味が違うのでしょうか?ご教示お願いします。
>ユーザインターフェーススレッドを作成するAfxBeginThreadでは、パラメタで指定した
>クラスのインスタンスを作るということでしょうか?
そうです。
>それを終了する場合のPostQuitMessageやAfxEndThreadのスレッド終了とExitInstance
の
>インスタンス終了では意味が違うのでしょうか?ご教示お願いします。
PostQuitMessage() は、ユーザインターフェーススレッド(=通常、メッセージポンプ
を持ちます)が、自身を終了することをシステムに知らせるために呼び出します。
PostQuitMessage() によってメッセージポンプは停止し、所定の終了処理を実行した後
にスレッドは終了します。その過程で ExitInstance() が呼び出されます。
これに対して、AfxEndThread() を呼び出すと、そのスレッドは所定の終了処理を実行す
ることなく終了してしまいます。
渋木さん回答ありがとうございます。
AfxBeginThreadでインスタンスが作られるということは、AfxBeginThreadで生成したス
レッドを、PostQuitMessageやAfxEndThreadでなくてもExitInstanceでも終了できるとい
うことですか?
再度ご教示お願いします。
すいません。よくわからなかったのですが。。。
PostQuitMessageでExitInstanceが呼ばれるのでよいということでしょうか?
それともその他の処理が行われないからだめということでしょうか?
>AfxBeginThreadでインスタンスが作られるということは、
>AfxBeginThreadで生成したスレッドを、PostQuitMessageやAfxEndThread
>でなくてもExitInstanceでも終了できるということですか?
できません。
AfxBeginThreadでは、クラスが新たにできるのではなく、インスタンスがつくられると
いうことですよね?
ではなぜExitInstanceでは終了できないのでしょうか?
何度もすいませんがお願いします。
>AfxBeginThreadでは、クラスが新たにできるのではなく、インスタンスがつくられると
>いうことですよね?
>ではなぜExitInstanceでは終了できないのでしょうか?
この発言からするに、「ExitInstanceという名前」と「インスタンスを終了させる」と
「スレッドを終了させる」がごちゃごちゃになっているように思えます。
自分でExitInstance()を呼び出そうとしているんでしょうか?
ユーザーインタフェーススレッドは、通常のメインスレッドがウィンドウズメッセージを
処理する仕組みと全く同じように動きます。メインスレッドに対して、自分でExitInstance()
を呼び出したりするんですか?
という時点で、わからないなら、ウィンドウズアプリの基本的な挙動を勉強すべきかと。
あと、MSDNのCWinThread::ExitInstance()やAfxBeginThead()の解説はちゃんと読みました
か?
ここに終了のさせ方等いろいろ書いてあると思いますが…
http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/vclib/html/_mfc_CWinThread.3a3a.ExitInstance.asp
MSDNには呼ぶな!と書いてあるしThreadを終了させるものとは書いてないから
これを呼ぶことで終了はできないでしょう。
使ったこと無いのでよくわからないのですが多分ただの終了時に呼び出される
関数でInitInstanceあたりでした初期化処理の後片付け用じゃないのかな?
色々ご回答ありがとうございます。
最後に下記について教えてください。
MSDNには、ExitInstanceはスレッドのインスタンスを終了させるために呼び出される
とかいてありますが、スレッドのインスタンスとはどういう意味でしょうか?
ここまで話が進んでいるにも拘らず、スレッドのインスタンスがわからんというのが
良く分からないんですが、
言葉のままの意味だと思います。
そのスレッドのインスタンスです。
スレッドが動作している事とスレッ
ドのインスタンスが存在する事は同意ではありません。
というか、スレッドとインスタンスという単語の意味から考えれば
想像できると思うのですが、言い過ぎ?
えっと、
ExitInstanceメンバ関数は、CWinThreadクラスにおける
終了処理において、フレームワーク(MFC)により
「呼び出される」ものです。
なので、ExitInstanceメンバ関数を呼び出したからといって、
スレッドが終了するわけではありません。
ExitInstanceメンバ関数の中に記述されている処理を
実行したいのなら、直接ExitInstanceメンバ関数を
呼び出すのではなく、PostQuitMessage()を実行して、
スレッドを終了させ、フレームワークに
「実行させる」必要があります。
ご回答ありがとうございました。
理解できました。