掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ダイアログの切替時にワーカススレッドを正しく終了させる方法 (ID:71700)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
タブコントロールで2つのタブが存在する、ダイアログベースのアプリを作成しています。 各タブで使用しているダイアログ上で、切替表示時(OnShowWindow())に、ログファイルを読み込み、各行をCTreeCtrlでツリー表示させることをしています。 ツリーコントロールのアイテム数が不明ということで、別スレッドで処理を行いアイテム追加を行っています。 ログの読込み、TreeCtrlにアイテム追加中でも、タブコントロールを切替できるよう作成する必要があります。 始めは、※1の方法で、ダイアログの非表示時にスレッドを終了させる方法を考えていましたが、どうも、WaitForSingleObject()が呼ばれたときにforループ中でフリーズしてしまう現象が起こりました。 いろいろ試行錯誤して、※2のようにPostMessage()で1アイテムあたりのデータを送信する方法に変更したところ、正常にログ読込み時でも終了することができました。 正常に動作しているように見えますが原因がわからず、少し気持ち悪い状態です。 長文で申し訳ありませんが、原因がわかる方がいましたらご教授お願いいたしますm(_ _)m --追伸-- メインのスレッドでWaitForSingleObjectを使っているのは少し気持ち悪いですが、ログ読込みのスレッドが完全に終了してから ダイアログの切替を行いたいために、以下のコードにしました。ログの読込みにはさほど時間がかかりませんが、TreeCtrlにアイテム挿入時に時間がかかるため、 実質、ログ読込みのスレッドの停止時にはすぐに終了します。 //■メンバ変数 //TreeCtrl CTreeCtrl m_cLogTreeCtrl; //停止フラグ bool m_bStopFlag; void CLogDlg::OnShowWindow(BOOL bShow, UINT nStatus) { //表示 if(bShow) { m_bStopFlag = false; m_pReadLogThr = AfxBeginThread(CLogDlg::LogTreadProcStub, this); m_pReadLogThr->m_bAutoDelete = FALSE; m_pReadLogThr->ResumeThread(); } //非表示 else { m_bStopFlag = true; //スレッドインスタンスの破棄 if(m_pReadLogThr) { WaitForSingleObject( m_pReadLogThr->m_hThread, INFINITE ); delete m_pReadLogThr; m_pReadLogThr = NULL; } } } //ダメな方法 ※1 bool CLogDlg::LogThreadProc() { //ログ読込み作業 省略・・・ vector<CString> aLog; for(UINT ii = 0; ii < aLog.size(); ii++) { if(m_bStopFlag) break; m_cLogTreeCtrl.SetItem(....); //ログを追加 } } /////////////////////////////////////////////////////////////////////////////// //正常に行えた方法 ※2 bool CLogDlg::LogThreadProc() { //ログ読込み作業 省略・・・ vector<CString> aLog; for(UINT ii = 0; ii < aLog.size(); ii++) { if(m_bStopFlag) break; PostMessage(...); //1アイテムあたりのデータを送信する } } LRESULT CLogDlg::OnReceiveMsg(UINT wParam,LONG lParam) { m_cLogTreeCtrl.SetItem(....); //ログを追加 }
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.