VC++ 6.0 MFC ダイアログベースです。
メインダイアログ画面で、ボタンを押下した時に、別ダイアログ(子ダイアログ)が呼び出されて、
その子ダイアログ内では、ワーカースレッドを使用して処理を行い、
処理結果をエディットボックスに表示させています。
子ダイアログを閉じる時に、WaitForSingleObject を使って、スレッドを完全に終了させてからダイアログを閉じるように
しているのですが、スレッドの処理が、エディットボックスに書き込む時に閉じてしまうと、
スレッドがそこで止まってしまいスレッドが終了しません。
このような場合どうしたら良いのでしょうか?
・閉じるボタンが押されたら、エディットボックスに書き込まないようにすれば良いと思い、
(フラグを立てて試したのですが、フラグチェック後に閉じるが押されることがあり失敗)
// スレッドの開始
m_Thread = AfxBeginThread(ThreadFunc, this);
// この時、子ダイアログを閉じてしまうと
// INFINITEなので、ずっと止まってしまいます。
CString data = "処理結果";
case 0: m_M0edit.SetWindowText(data); break;
case 1: m_M1edit.SetWindowText(data); break;
case 2: m_M2edit.SetWindowText(data); break;
・
・
・
・
// 子ダイアログを閉じる時に呼び出されます。
// スレッドでの処理が完全に終わるのを待ちます。
afx_msg void CSelecting_Dlg::OnClose()
{
DWORD dwRet
dwRet = WaitForSingleObject(m_Thread->m_hThread, INFINITE);
EndDialog(0);
}
/***************/
失敗談
/***************/
// スレッドの開始
m_Thread = AfxBeginThread(ThreadFunc, this);
// この時、子ダイアログを閉じてしまうと
// INFINITEなので、ずっと止まってしまいます。
CString data = "処理結果";
if (m_openFlag == 1){//フラグを見て書き込みするかチェックする。
switch (t){
case 0: m_M0edit.SetWindowText(data); break;
case 1: m_M1edit.SetWindowText(data); break;
case 2: m_M2edit.SetWindowText(data); break;
・
・
・
・
}
}
// 子ダイアログを閉じる時に呼び出されます。
// スレッドでの処理が完全に終わるのを待ちます。
afx_msg void CSelecting_Dlg::OnClose()
{
DWORD dwRet
m_openFlag = false;//閉じるボタンが押されたら フラグを降ろす。
dwRet = WaitForSingleObject(m_Thread->m_hThread, INFINITE);
EndDialog(0);
}
No.1ベストアンサー
- 回答日時:
danner です。
「dwRet = WaitForSingleObject(m_Thread->m_hThread, INFINITE);」の行を下記のように書き換えたらいかがでしょうか。
while(WaitForSingleObject(m_pCDThread->m_hThread, 0) == WAIT_TIMEOUT){
MSG msg;
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
AfxGetApp()->PumpMessage();
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VC++スレッドの正しい終了のさ...
-
PHPについて質問があります。 ...
-
Macターミナルで実行中のプログ...
-
緯度、経度の 10進法と 60進法...
-
C# シリアル通信でデータ受信...
-
UWSCがうまく動かない
-
このレジの並び方は間違ってま...
-
マージャンのゲームを作りたい...
-
プロセス終了の検知について
-
VBA kernel32 の意味
-
Arduinoのプログラムで質問です。
-
家電製品の電力周波数を変える機械
-
isoをimgに変換したいのですが...
-
c++からfortranの関数を呼び出す
-
Mac 乗数の入力方法
-
clock関数は正確じゃないの?
-
N88BASICのバイナリデータをテ...
-
オープンアプリの 通信許可の...
-
アセンブラ言語の数字を数値に...
-
怪しいプロセス教えてください。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WaitForSingleObjectの使い方に...
-
スレッドの監視方法について
-
Windows上で、シグナル(SIGTERM...
-
VC++スレッドの正しい終了のさ...
-
スレッドにて同一メモリの書き...
-
スレッドの安全な終了のさせ方
-
メインスレッドのPostMessageと...
-
C# スレッドから親ウィンドウへ...
-
別スレッドからメインダイアロ...
-
スレッドの終了はどうやるんで...
-
MFC通信プログラムマルチスレッ...
-
同一スレッドで、ロックをかけ...
-
VB2005 シリアル通信のClose処理
-
スレッドの終了の仕方
-
Linuxでスレッド優先度って変え...
-
LinuxでDoEvents()同等機能
-
C#でスレッド実行中のイベント...
-
msec単位のWait Timerが作れない!
-
スレッド終了を待つ間に開放さ...
-
win32 スレッドのハンドルついて
おすすめ情報