アプリケーションの強制終了について

[戻る]
トラキチ 2004/07/26(月) 14:21:48
お初にお目にかかります。

質問なんですが、無限ループ内である処理(以下、A 処理 )のリトライ回数が指定され
た回数を超えた場合にアプリケーションを終了させたいのですが、その際に OnOK
( ) ; -> OnClose( ) ; の順番に行っていますが再度、A 処理が行われてしまうため、
一向にアプリケーションを終了してくれません。
exit( 1 ) ; を使用せずに行える方法を知っている方がいましたらご教授ください。

環境
WindowsXP
Visual C++ .NET MFC

Ban 2004/07/26(月) 14:23:50
よく状況がわからないのですが、
PostQuitMessage(1)
とか言うことではなくて、ですか?

PATIO 2004/07/26(月) 15:32:38
まずは、アプリケーションの構成をきちんと提示してください。
MFCの使用状況、SDI等のウインドウ構成。
アプリケーションがその動作をするときのウインドウの表示状況等々。

あなたが知っていることでもこれを読んでいるだけの人間には
解らないことだらけです。
自分しか知らないことは全て書きましょう。

トラキチ 2004/07/26(月) 16:32:09
アプリケーションの構成は、ダイアログベースです。

以下にロジックを記載します

m_hSocket = SocketOpen( m_cIPAddr , m_nPort ) ;
if( m_hSocket == NULL )
{
    while( 1 )
    {
        // リトライ回数が指定回数超過
        if( nRetryCnt >= m_nConnectRetry )
        {
            exit( 1 ) ;    // *1
        }

        // 接続のリトライ
        m_hSocket = SocketOpen( m_cIPAddr , m_nPort ) ;
        // 接続失敗
        if( m_hSocket == NULL )
        {
            nRtnKey = ::MessageBox( m_hWnd , "" , "接続失敗" ,
                        MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2 ) ;    // *2
            if( nRtnKey == IDNO )
            {
                exit( 1 ) ;    // *1
            }
            nRetryCnt++ ;
        }
        else
        {
            break ;
        }
    }
}

上記の *1 の部分( exit( 1 ) ; )を OnOK( ) ; OnClose( ) ; に変えて動かしたとこ
ろ、アプリケーションを終了しないで再度、無限ループを始めてしまい *2 が永遠と繰
り返されてしまいます( 現在、わざと Socket を作成できないようにしているため )。
ちなみに、このアプリケーションのダイアログには終了ボタン( デフォルトで作られる 
OK ボタンの Caption を変えただけ )があるのですが、それは OnOK( ) ; OnClose
( ) ; でアプリケーションを終了してくれます。
要は、終了ボタンと同じロジックにしたいと考えています。

PATIO 2004/07/26(月) 16:40:40
モーダルダイアログならEndDialogを呼びませんか?
モーダルダイアログの動きに関する調査をして動作を理解してから
組むようにしないとはまると思いますよ。

PATIO 2004/07/26(月) 16:41:47
あと、EndDialogを読んだら、whileループを抜けるようにしないと駄目でしょう。

Ban 2004/07/26(月) 16:45:29
デフォルトの CDialog::OnOK は、
内部で ::EndDialog を呼んで終了してますね。

とりあえず、処理に失敗したら break してちゃんと
関数から抜けてください。

トラキチ 2004/07/26(月) 16:55:22
[[解決]]
EndDialog( 1 ) の後に break したらうまくアプリケーションが終了してくれました。
EndDialog( 1 ) を呼んだだけでは駄目なんですね。
勉強になりました。

ありがとうございます。

古いスレッドには追加発言できません。