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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Excel(エクセル) Excel-VBAの「しばらくお待ちください」のダイアログが自動的に閉じない 2 2023/05/24 15:31
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- その他(プログラミング・Web制作) Python - Excel で Webからデータを連続取得したいのですが エラーが出ます 1 2023/07/06 20:08
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- Visual Basic(VBA) シートをコピーする下記記述でダイアログを用いた記述がわかりません?( A = Dir(ThisWor 4 2022/08/22 12:26
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VC++スレッドの正しい終了のさ...
-
マルチスレッドプログラム
-
スレッドの安全な終了のさせ方
-
sleep関数とは?
-
スレッドの監視方法について
-
gprofとスレッドについて
-
スレッドの終了はどうやるんで...
-
メインスレッドのPostMessageと...
-
複数スレッドを動作させるのに...
-
スレッドの終了の仕方
-
WaitForSingleObjectの使い方に...
-
LinuxでDoEvents()同等機能
-
Windows上で、シグナル(SIGTERM...
-
Macターミナルで実行中のプログ...
-
緯度、経度の 10進法と 60進法...
-
バックグラウンドのプロセスの...
-
TCP/IP通信時のサーバーからの受信
-
vba listviewにおけるtextのAli...
-
C言語で、メモリを解放しないで...
-
sil_rew_memのメモリアクセスに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VC++スレッドの正しい終了のさ...
-
WaitForSingleObjectの使い方に...
-
マイクロソフトedge で5チャン...
-
スレッドの安全な終了のさせ方
-
スレッドの終了はどうやるんで...
-
スレッドにて同一メモリの書き...
-
スレッドの監視方法について
-
マルチスレッドについて
-
スレッドの終了の仕方
-
Linuxでスレッド優先度って変え...
-
Windows上で、シグナル(SIGTERM...
-
LinuxでDoEvents()同等機能
-
待機関数(WaitForMultipleObjec...
-
VB2005 シリアル通信のClose処理
-
マルチスレッドプログラミング...
-
別スレッドからメインダイアロ...
-
_beginthreadexで生成したスレ...
-
msec単位のWait Timerが作れない!
-
マルチスレッドのスレッド数を...
-
.NetのBackgroundWorkerクラス...
おすすめ情報