- 締切済み
[C#]関数の中からプロセスを終了する
ある条件になったらプロセスを終了するという事したいのです。 方法として、 bool end_flag (trueだったら終了) を用意しておいて、ある条件になったらtrueにして 定期的にend_flagをチェックしてtrueならreturnする。 ただ、この方法は現在作っているプログラムでは微妙なのです。 うまく説明できるかわかりませんが・・・ まずプログラムが数千行と長くなっていて 定期的に、end_flagをチェックしにくのが困難。 (プログラムがさらに長くなるので出来れば書きたくない) 出来ればプログラムで定期的に使っている関数(自作)があって、 「その関数の中でend_flagをチェックする」 という事をやりたいのですがどう書けばいいかわかりません。 関数の中で、 if (end_flag == true) { return; } と書いても、関数の中のプロセスが終わってメインのプロセスにもどるだけです。 関数の中で、メインのプロセスを終わらせることってできるんですか? もしくは、どんな場所からでも現在行っているプロセスを終了して、 ツールを起動した状態に戻すという事は可能なのでしょうか? よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
「ある条件になったら、実行中の処理をすべて放り出して、大元の呼び出し元に戻る」と言う場合は「例外処理」を用います。 try-finally構文の中で、throwを呼び出すと、強制的にfinally節に飛んでいきます。 throwを行ったのが、関数を呼んだ先の奥深くでも、全部吹っ飛ばしてfinallyに飛んできます。 そして「if (条件) end_flag=true;」の代わりに「if (条件) throw new Exception("実行中断");」って書けば良いです。 なお、例外処理を用いると「0除算」などの本当の例外が起きてもすべてfinallyに飛んで来ちゃうので、その場合は「setjump」と「longjump」を用います。
- wormhole
- ベストアンサー率28% (1626/5665)
#2のお礼を読んだ感じだと プロセスを終了させたいわけではなく スレッドを終了させたいわけではなく check()の呼び出し元となるbutton1_Click()を終わらせたいってだけのような。 それだと基本#3の方の書かれている方法になるんですが。 #2のお礼中のコメント >//でもメインプログラムで使うのでついでにend_flagをチェックして実行中のスレッドを終了させたい。 がちょっと気になります。 もしかしてbutton1_Click()が終了しないと他所からcheck()が使えないと思ってますか? もし、そう思われているのでしたら、そもそも例にあるbutton1_Click()のようなコントロールのイベントハンドラで長時間処理を行うべきではないので、その辺から見直さないといけないです(長時間処理を行っているとその間UIの操作ができないです)。
- DUDDLAY
- ベストアンサー率66% (136/203)
duddlay と申します。 ANo.1 お礼の例文で行きますと、do while 文と check() 関数を bool 型にするのが いいと思いますが、いかがでしょうか? private bool check( 何らかの処理 ); // 関数の宣言 private void button1_Click(object sender, EventArgs e) { // 何らかの処理 do { // 何らかの処理 if( check( 何らかの引数 ) == TRUE ) break; // 何らかの処理 } while(1); // check() が TRUE になるまでループ } private bool check( 何らかの引数 ) { if ( 何らかの処理 == TRUE ){ return( TRUE ); } return( FALSE ); } 注意点としては、do while が無限ループになるので、check() 関数や、何らかの処理で、 他のスレッドが動く様にセマフォ管理をして下さい。 以上、ご参考までに。
- wormhole
- ベストアンサー率28% (1626/5665)
>これだとアプリケーション自体終わってしまいますよね? 「プロセスを終了する」と書かれているのでアプリケーションの終了だと思ったのですが、もしかしてスレッドの終了をされたいのですか?
お礼
すみません。プログラムを始めたばかりで言葉の選択をグチャグチャですね。。。 スレッドって言うんですね。 はい。アプリケーション自体は終わらせたくないです。 例えば、以下のようにしたいのです。 ※以下の例だと、チェックのところにif (end_flag == true){return;}と書けば済むのですが、実際のプログラムはもっと複雑です。 private void button1_Click(object sender, EventArgs e) { for(int n=0; n<10000000000000000; n++) { textBox1.Text = n.ToString(); check();//実際のプログラムでよく使う関数 } } private void check() { //実際のプログラムでは違う処理をする。 //でもメインプログラムで使うのでついでにend_flagをチェックして実行中のスレッドを終了させたい。 if (end_flag == true) { //button1_Clickを終わらせる処理 } }
- wormhole
- ベストアンサー率28% (1626/5665)
お礼
早速の回答ありがとうございます。 Application.Exitですよね。 これだとアプリケーション自体終わってしまいますよね? 何か引数を入れたりして終わらせない方法があるのでしょうか?
お礼
duddlay さん回答ありがとうございます。 なるほど。checkで戻り値を作るってことですね。 ってことはcheckを全て書き直す必要があるんですね。 参考になりますありがとうございます!