スレッドの終了を待ってから画面を終了させる

解決


ぽむ  2005-05-12 16:52:37  No: 57369  IP: 192.*.*.*

バックグラウンドでスレッドが10個程動いているアプリ
なのですが、メインの画面から「×」or終了ボタンを押す
ことにより、確認ダイアログを表示し「はい」を押下でア
プリの終了をさせたいと考えていたのですが、

「はい」を押した瞬間にメインの画面は消えるのですが、
裏ではスレッドの終了処理を行っており、画面上を見る限
りは完全に終了したかのように見えてしまいます。

全てのスレッドが完全に終了してから画面を消去させたいと
思っているのですが、方法がわかりません。どなたか方法
を教えて頂けませんか?

環境はVC6-SP3 Win2K SDIで開発してます。
宜しくお願いします。

編集 削除
ゃぃゅ  2005-05-12 18:10:30  No: 57370  IP: 192.*.*.*

WaitForMultipleObjects

編集 削除
いおり  2005-05-12 18:17:55  No: 57371  IP: 192.*.*.*

Xボタンが押された場合、WM_CLOSE メッセージが飛んでくるので、
そこで DestroyWindow を呼ばずに全スレッドの終了命令を発行する。
で、全スレッドが終了したら改めて DestroyWindow を発行する。

というようにすればいいと思います。

編集 削除
ぽむ  2005-05-13 10:33:45  No: 57372  IP: 192.*.*.*

ゃぃゅさん、いおりさん回答ありがとうございます。
いおりさんの回答を参考に早速やってみました。
一応希望通りになりました・・・が、見栄えとして
変ですね。画面は消えないけどボタンとかが固まって
スレッドが終わるまでハングアップ状態な感じで・・・

別パターンになってしまいますが、メインの画面を消して
画面中央に「終了処理中です...」のダイアログ(タイトル
バーなし)を出す事って可能でしょうか?

メインが消えてるのに他のダイアログ呼べるんでしょうか?
MFC難しいです(--;画面周りは勉強しながらなので
すみませんが宜しくお願いします。

編集 削除
いおり  2005-05-13 15:43:44  No: 57373  IP: 192.*.*.*

自分のウィンドウを削除するのではなく、非表示にすればいいのでは?
MFCはよく分からないのですが、そうすれば普通にダイアログを
呼べるような気がします。

編集 削除
ぽむ  URL  2005-05-16 09:17:04  No: 57374  IP: 192.*.*.*

>いおりさん
有難うございます。自分でも色々探して「消す」んじゃなくて
「見えなくする」という事に気がつきました(^^;
一応こんな感じで出来ました。有難うございましたm(__)m

void CMainFrame::OnClose() 
{
---------中略-------------
    // 終了確認
    nMsgRtn = AfxMessageBox (MES_APP_END, MB_OKCANCEL);
    if (nMsgRtn != IDOK) {
        return;
    }

    // メインウィンドウを隠す
    this->ShowWindow(SW_HIDE);

    CEndDlg *dlg;
    dlg = new CEndDlg;
    dlg->Create(this);
    dlg->BringWindowToTop();

    delete m_thread;
    m_thread = NULL;
  
    delete dlg;

    CFrameWnd::OnClose();
    return;
}

編集 削除