バックグラウンドでスレッドが10個程動いているアプリ
なのですが、メインの画面から「×」or終了ボタンを押す
ことにより、確認ダイアログを表示し「はい」を押下でア
プリの終了をさせたいと考えていたのですが、
「はい」を押した瞬間にメインの画面は消えるのですが、
裏ではスレッドの終了処理を行っており、画面上を見る限
りは完全に終了したかのように見えてしまいます。
全てのスレッドが完全に終了してから画面を消去させたいと
思っているのですが、方法がわかりません。どなたか方法
を教えて頂けませんか?
環境はVC6-SP3 Win2K SDIで開発してます。
宜しくお願いします。
WaitForMultipleObjects
Xボタンが押された場合、WM_CLOSE メッセージが飛んでくるので、
そこで DestroyWindow を呼ばずに全スレッドの終了命令を発行する。
で、全スレッドが終了したら改めて DestroyWindow を発行する。
というようにすればいいと思います。
ゃぃゅさん、いおりさん回答ありがとうございます。
いおりさんの回答を参考に早速やってみました。
一応希望通りになりました・・・が、見栄えとして
変ですね。画面は消えないけどボタンとかが固まって
スレッドが終わるまでハングアップ状態な感じで・・・
別パターンになってしまいますが、メインの画面を消して
画面中央に「終了処理中です...」のダイアログ(タイトル
バーなし)を出す事って可能でしょうか?
メインが消えてるのに他のダイアログ呼べるんでしょうか?
MFC難しいです(--;画面周りは勉強しながらなので
すみませんが宜しくお願いします。
自分のウィンドウを削除するのではなく、非表示にすればいいのでは?
MFCはよく分からないのですが、そうすれば普通にダイアログを
呼べるような気がします。
>いおりさん
有難うございます。自分でも色々探して「消す」んじゃなくて
「見えなくする」という事に気がつきました(^^;
一応こんな感じで出来ました。有難うございました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;
}
ツイート | ![]() |