アプリケーションの強制終了について – プログラミング – Home

アプリケーションの強制終了について
 
通知
すべてクリア

[解決済] アプリケーションの強制終了について


トラキチ
 トラキチ
(@トラキチ)
ゲスト
結合: 20年前
投稿: 3
Topic starter  

お初にお目にかかります。

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

環境
WindowsXP
Visual C++ .NET MFC


引用未解決
トピックタグ
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

よく状況がわからないのですが、
PostQuitMessage(1)
とか言うことではなくて、ですか?


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

まずは、アプリケーションの構成をきちんと提示してください。
MFCの使用状況、SDI等のウインドウ構成。
アプリケーションがその動作をするときのウインドウの表示状況等々。

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


返信引用
トラキチ
 トラキチ
(@トラキチ)
ゲスト
結合: 20年前
投稿: 3
Topic starter  

アプリケーションの構成は、ダイアログベースです。

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

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
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

モーダルダイアログならEndDialogを呼びませんか?
モーダルダイアログの動きに関する調査をして動作を理解してから
組むようにしないとはまると思いますよ。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

あと、EndDialogを読んだら、whileループを抜けるようにしないと駄目でしょう。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

デフォルトの CDialog::OnOK は、
内部で ::EndDialog を呼んで終了してますね。

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


返信引用
トラキチ
 トラキチ
(@トラキチ)
ゲスト
結合: 20年前
投稿: 3
Topic starter  

EndDialog( 1 ) の後に break したらうまくアプリケーションが終了してくれました。
EndDialog( 1 ) を呼んだだけでは駄目なんですね。
勉強になりました。

ありがとうございます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました