
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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スレッドにて同一メモリの書き...
-
WaitForSingleObjectの使い方に...
-
スレッドでWM_TIMERを受け取れない
-
スレッドの監視方法について
-
Macターミナルで実行中のプログ...
-
powershell を使いカレントディ...
-
バックグラウンドのプロセスの...
-
パソコンの演算速度について
-
エクセルVBA 大容量CSVファイル...
-
VBSの処理中一旦処理を止めて再...
-
【C言語】再帰が時間がかかる...
-
子プロセスの状態を親プロセス...
-
keycodeについて
-
sendkeysにてALT+CTRL+INSERTを...
-
マイコンからプログラムを読み...
-
スーパーのレジで並んでいたら...
-
逆コンパイルと逆アセンブルの...
-
プロセスIDからウィンドウハ...
-
フレームワーク「4.8.1」で、[S...
-
TCP/IP通信時のサーバーからの受信
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WaitForSingleObjectの使い方に...
-
VC++スレッドの正しい終了のさ...
-
Windows上で、シグナル(SIGTERM...
-
スレッドにて同一メモリの書き...
-
.netアプリへのSendMessageでフ...
-
メインスレッドのPostMessageと...
-
スレッドの監視方法について
-
C# スレッド終了の監視について
-
_beginthreadexで生成したスレ...
-
別スレッドのデータを受信できない
-
別スレッドからメインダイアロ...
-
スレッドの安全な終了のさせ方
-
マルチスレッドのスレッド数を...
-
VB2005 シリアル通信のClose処理
-
スレッドの終了の仕方
-
pthread_cond_wait 取りこぼし?
-
マルチスレッドプログラム
-
Linuxでスレッド優先度って変え...
-
別スレッドとイベントの終了手...
-
Win32APIでのスレッド処理
おすすめ情報