
ある条件になったらプロセスを終了するという事したいのです。
方法として、
bool end_flag (trueだったら終了)
を用意しておいて、ある条件になったらtrueにして
定期的にend_flagをチェックしてtrueならreturnする。
ただ、この方法は現在作っているプログラムでは微妙なのです。
うまく説明できるかわかりませんが・・・
まずプログラムが数千行と長くなっていて
定期的に、end_flagをチェックしにくのが困難。
(プログラムがさらに長くなるので出来れば書きたくない)
出来ればプログラムで定期的に使っている関数(自作)があって、
「その関数の中でend_flagをチェックする」
という事をやりたいのですがどう書けばいいかわかりません。
関数の中で、
if (end_flag == true) { return; }
と書いても、関数の中のプロセスが終わってメインのプロセスにもどるだけです。
関数の中で、メインのプロセスを終わらせることってできるんですか?
もしくは、どんな場所からでも現在行っているプロセスを終了して、
ツールを起動した状態に戻すという事は可能なのでしょうか?
よろしくお願いします。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
「ある条件になったら、実行中の処理をすべて放り出して、大元の呼び出し元に戻る」と言う場合は「例外処理」を用います。
try-finally構文の中で、throwを呼び出すと、強制的にfinally節に飛んでいきます。
throwを行ったのが、関数を呼んだ先の奥深くでも、全部吹っ飛ばしてfinallyに飛んできます。
そして「if (条件) end_flag=true;」の代わりに「if (条件) throw new Exception("実行中断");」って書けば良いです。
なお、例外処理を用いると「0除算」などの本当の例外が起きてもすべてfinallyに飛んで来ちゃうので、その場合は「setjump」と「longjump」を用います。
No.4
- 回答日時:
#2のお礼を読んだ感じだと
プロセスを終了させたいわけではなく
スレッドを終了させたいわけではなく
check()の呼び出し元となるbutton1_Click()を終わらせたいってだけのような。
それだと基本#3の方の書かれている方法になるんですが。
#2のお礼中のコメント
>//でもメインプログラムで使うのでついでにend_flagをチェックして実行中のスレッドを終了させたい。
がちょっと気になります。
もしかしてbutton1_Click()が終了しないと他所からcheck()が使えないと思ってますか?
もし、そう思われているのでしたら、そもそも例にあるbutton1_Click()のようなコントロールのイベントハンドラで長時間処理を行うべきではないので、その辺から見直さないといけないです(長時間処理を行っているとその間UIの操作ができないです)。
No.3
- 回答日時:
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() 関数や、何らかの処理で、
他のスレッドが動く様にセマフォ管理をして下さい。
以上、ご参考までに。
duddlay さん回答ありがとうございます。
なるほど。checkで戻り値を作るってことですね。
ってことはcheckを全て書き直す必要があるんですね。
参考になりますありがとうございます!
No.2
- 回答日時:
>これだとアプリケーション自体終わってしまいますよね?
「プロセスを終了する」と書かれているのでアプリケーションの終了だと思ったのですが、もしかしてスレッドの終了をされたいのですか?
すみません。プログラムを始めたばかりで言葉の選択をグチャグチャですね。。。
スレッドって言うんですね。
はい。アプリケーション自体は終わらせたくないです。
例えば、以下のようにしたいのです。
※以下の例だと、チェックのところに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を終わらせる処理
}
}
No.1
- 回答日時:
早速の回答ありがとうございます。
Application.Exitですよね。
これだとアプリケーション自体終わってしまいますよね?
何か引数を入れたりして終わらせない方法があるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
VB6.0 SHELLで起動...
-
ADOでアクセスのレコードに...
-
services.exeが延々と。
-
VBでエクセルを起動し、プロ...
-
怪しいプロセス教えてください。
-
C#でのbatファイル実行結果取得
-
exeファイルを終了させない。
-
ストール監視の監視方法
-
CPUの使用率について
-
Windowsで環境変数を設定できま...
-
explorer.exeが異様にメモリを食う
-
IISがフリーズ
-
起動しているプロセスの確認
-
タスクマネージャーのプロセス...
-
sleep関数の精度について
-
プロセスIDからウィンドウハ...
-
vb.netでEXCEL起動がうまくでき...
-
WebBrowserでPDF表示でのトラブル
-
ShellExecuteが起動したプロセ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
プロセスのアタッチ・デタッチ...
-
非表示になったエクセルは?
-
C#でのbatファイル実行結果取得
-
Process.Startの戻り値を後で取得
-
タスクマネージャーのプロセス...
-
SendMessageが失敗するときがある
-
VB6.0 SHELLで起動...
-
Linuxでのスレッド間メッセージ...
-
vb.netでEXCEL起動がうまくでき...
-
explorer.exeが異様にメモリを食う
-
プロセスIDの取得方法について
-
IISがフリーズ
-
jdbcのプロセスの処理について
-
c言語でプロセスIDを調べたい
-
セマフォとmutexの違いは?
-
警告『 別のプロセスで使用され...
-
ADOでアクセスのレコードに...
-
OSPFでプロセスを分ける意義に...
-
Windowsでのfork方法
おすすめ情報