dポイントプレゼントキャンペーン実施中!

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);
}

A 回答 (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();
}
    • good
    • 0
この回答へのお礼

danner さん

色々方法があるのですね。
解決と同時にとても勉強になりました。
ありがとうございました。

お礼日時:2007/04/25 11:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!