スレッドの終了コード取得について

[戻る]
めぐ 2005/01/06(木) 16:58:21
初めてこのようなところに書込みさせていただきます。
「使用上の注意」を読みましたが、失礼がありましたらお許しください。

現在、VC6環境下でスレッドを使用したプログラムを作成しております。
デバック環境ではアウトプットウィンドウにスレッドの終了コードが
表示されますのでそちらの方を確認しておりますが
本プロウグラムはWindowsOSの各バージョンにてテストを行う為
アウトプットウィンドウに表示される内容を
ログファイルとして残すことは出来ないかと思っております。
(せめてスレッドの終了コードだけでも残したいです。)

ご存知の方がいらっしゃいましたらご教授願います。
現在のコードを書きに示します。問題点がございましたらご指摘いただければと思います。

---------------------------------------------------------------------------
void CINSPECTORDlg::OnButtonTest() 
{
    /* スレッド作成 */
    if( m_pThread_test ) return;    /* スレッドは2重起動しない */

    m_bThread_test = TRUE;
    m_pThread_test = AfxBeginThread(TESTMain_Thread,this);
}

UINT CINSPECTORDlg::TESTMain_Thread( LPVOID pParam )
{
    return ((CINSPECTORDlg*)pParam)->TESTMain();
}

UINT CINSPECTORDlg::TESTMain()
{
         UINT stat;
         stat = 0;
         if( /* 判定1 */ ){
        stat = 1;
         }
         if( /* 判定1 */ ){
        stat = 2;
         }
         if( /* 判定1 */ ){
        stat = 3;
         }

         return stat;
}
---------------------------------------------------------------------------

シャノン 2005/01/06(木) 17:27:01
m_pThread_test は CWinThread * ですよね。
うーん… CWinThread には、終了コード取得用のメソッドは無いのか。
GetExitCodeThread 関数を使うと良いでしょう。

tetrapod 2005/01/06(木) 17:36:17
っていうか、スレッドが自分自身の終了時にログファイルに終了コードを書けばいいような。

Advance 2005/01/06(木) 19:58:26
そういうのはリモートデバッグを使えばいいんじゃないかしら?

ターゲットPCにいくつかのファイルをコピーするだけで環境整うし、
プログラムには何も変更いらない。
ステップ実行とかの細かいデバッグもできて楽ちん。
もちろんスレッドの終了コードもローカルデバッグと同様に表示される。

めぐ 2005/01/07(金) 09:52:09
皆さんありがとうございます。
思いつかなかったことばかりで、とても納得し自分の無知さを羞じております。

三種類試してみようと思っておりますが、
GetExitCodeThread関数の使い方が良く分かりません。
もし、簡単なサンプルコードがありましたら教えていただくことは出来ますか?

よろしくお願いいたします。

PATIO 2005/01/07(金) 10:52:18
私は、tetrapodさんに賛成。

スレッド自身でログに出すようにすれば、わざわざ取得する必要もないしシンプルだと。
スレッド側でログに吐き出すのが仕様上拙いとか言うのであれば仕方ないですけどね。
スレッドIDを使ってログファイル名を作ってやれば、ログファイルを分ける事もできると
思いますし。

GetExitCodeThread関数についてはHELP(MSDN)で調べてみましたか?
関数としてはシンプルな物なので特に迷うような要素はないと思うのですが。
注意点はスレッドハンドルを用意しておく事ぐらいかな。

めぐ 2005/01/07(金) 13:15:18
[[解決]]
PATIOさん

スレッド終了時にログ出力するのが一番良いのかもしれません。

> GetExitCodeThread関数についてはHELP(MSDN)で調べてみましたか?
> 関数としてはシンプルな物なので特に迷うような要素はないと思うのですが。

もちろん調べてみました。
ただ、終了コードが取得できないので私のソースがおかしいのかとおもい
サンプルがあれば・・・という風にしました。

自力でがんばってみようと思います。

皆さんどうもありがとうございました。

PATIO 2005/01/07(金) 17:09:16
引数はスレッドハンドルと終了コードを受ける変数だけなので
疑うとすれば、スレッドハンドルではないかと思うのですが、
正しいスレッドハンドルが渡せているかどうかの確認はしましたか?

スレッドハンドルはどのようにして得ていますか?
記憶違いでなければ、AfxBeginThreadで作成したスレッドは、
メンバー変数m_bAutoDeleteがTRUEになっているはずなので
スレッドが終了した時点で解放されてしまいます。
ですから、スレッドが終わった後でm_pThread_testからハンドルを取り出しても
もう解放された後なので不正アクセスになります。
スレッドハンドルが必要ならば、AfxBeginThreadの直後で行うしかないですが、
今のコードではこれすら既に終わっている可能性は否定できないと思います。
第5パラメータにCREATE_SUSPENDEDでも指定して一旦スレッドを止めておき、
AfxBeginThreadの直後でハンドルを取得するようにします。
取得後にCWinThread::ResumeThreadを呼んでスレッドを再開させる等の算段をすれば、
確実にスレッドハンドルを補足できると思います。

めぐ 2005/01/11(火) 14:29:28
ありがとうございます。
連休中チェックしておりませんでした。。。

ハンドルの取得が大事だということがわかり
スレッドの起動方法を変えました。
そうしたところうまくいきました。

ありがとうございました。

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