スレッドの終了コード取得について – プログラミング – Home

スレッドの終了コード取得について
 
通知
すべてクリア

[解決済] スレッドの終了コード取得について


めぐ
 めぐ
(@めぐ)
ゲスト
結合: 20年前
投稿: 8
Topic starter  

初めてこのようなところに書込みさせていただきます。
「使用上の注意」を読みましたが、失礼がありましたらお許しください。

現在、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;
}
---------------------------------------------------------------------------


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

m_pThread_test は CWinThread * ですよね。
うーん… CWinThread には、終了コード取得用のメソッドは無いのか。
GetExitCodeThread 関数を使うと良いでしょう。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

っていうか、スレッドが自分自身の終了時にログファイルに終了コードを書けばいいような。


返信引用
Advance
 Advance
(@Advance)
ゲスト
結合: 20年前
投稿: 3
 

そういうのはリモートデバッグを使えばいいんじゃないかしら?

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


返信引用
めぐ
 めぐ
(@めぐ)
ゲスト
結合: 20年前
投稿: 8
Topic starter  

皆さんありがとうございます。
思いつかなかったことばかりで、とても納得し自分の無知さを羞じております。

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

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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

私は、tetrapodさんに賛成。

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

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


返信引用
めぐ
 めぐ
(@めぐ)
ゲスト
結合: 20年前
投稿: 8
Topic starter  

PATIOさん

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

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

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

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

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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

引数はスレッドハンドルと終了コードを受ける変数だけなので
疑うとすれば、スレッドハンドルではないかと思うのですが、
正しいスレッドハンドルが渡せているかどうかの確認はしましたか?

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


返信引用
めぐ
 めぐ
(@めぐ)
ゲスト
結合: 20年前
投稿: 8
Topic starter  

ありがとうございます。
連休中チェックしておりませんでした。。。

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました