お初にお目にかかります。
質問なんですが、無限ループ内である処理(以下、A 処理 )のリトライ回数が指定され
た回数を超えた場合にアプリケーションを終了させたいのですが、その際に OnOK
( ) ; -> OnClose( ) ; の順番に行っていますが再度、A 処理が行われてしまうため、
一向にアプリケーションを終了してくれません。
exit( 1 ) ; を使用せずに行える方法を知っている方がいましたらご教授ください。
環境
WindowsXP
Visual C++ .NET MFC
よく状況がわからないのですが、
PostQuitMessage(1)
とか言うことではなくて、ですか?
まずは、アプリケーションの構成をきちんと提示してください。
MFCの使用状況、SDI等のウインドウ構成。
アプリケーションがその動作をするときのウインドウの表示状況等々。
あなたが知っていることでもこれを読んでいるだけの人間には
解らないことだらけです。
自分しか知らないことは全て書きましょう。
アプリケーションの構成は、ダイアログベースです。
以下にロジックを記載します
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
( ) ; でアプリケーションを終了してくれます。
要は、終了ボタンと同じロジックにしたいと考えています。
モーダルダイアログならEndDialogを呼びませんか?
モーダルダイアログの動きに関する調査をして動作を理解してから
組むようにしないとはまると思いますよ。
あと、EndDialogを読んだら、whileループを抜けるようにしないと駄目でしょう。
デフォルトの CDialog::OnOK は、
内部で ::EndDialog を呼んで終了してますね。
とりあえず、処理に失敗したら break してちゃんと
関数から抜けてください。
EndDialog( 1 ) の後に break したらうまくアプリケーションが終了してくれました。
EndDialog( 1 ) を呼んだだけでは駄目なんですね。
勉強になりました。
ありがとうございます。