ある条件になったらプロセスを終了するという事したいのです。
方法として、
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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonのDjangoでHTML内で変数を利用したいです 3 2022/05/15 15:33
- Visual Basic(VBA) excel VBA if文について 3 2022/03/27 17:42
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Windows 10 バッチファイルでのエクスプローラー終了 1 2022/05/30 14:32
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) マクロ実行時、自動で背景色を変えたい。 C列にあるチェックボックスをチェックするとB列に「TRUE」 4 2022/11/08 11:14
- その他(プログラミング・Web制作) VB.NETの正規表現について 4 2022/04/12 16:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
プロセスIDからウィンドウハ...
-
Process.Startの戻り値を後で取得
-
Linuxでのスレッド間メッセージ...
-
プロセスのアタッチ・デタッチ...
-
非表示になったエクセルは?
-
タスクマネージャーのプロセス...
-
共有メモリの使い方について
-
他のEXEが起動しているかの確認
-
C++のプログラムをバックグラウ...
-
ShellExecuteExでハンドルの取得
-
あなたにとってプライスレスな...
-
ShellExecuteが起動したプロセ...
-
信頼性技術 バスタブの初期不良...
-
c言語でプロセスIDを調べたい
-
vb.netでEXCEL起動がうまくでき...
-
C#でのbatファイル実行結果取得
-
プロセス終了の検知について
-
プロセスハンドル or ウインド...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
タスクマネージャーのプロセス...
-
C#でのbatファイル実行結果取得
-
プロセスIDからウィンドウハ...
-
プロセスのアタッチ・デタッチ...
-
VB6.0 SHELLで起動...
-
Process.Startの戻り値を後で取得
-
Linuxでのスレッド間メッセージ...
-
ウィンドウのタイトルからプロ...
-
プロセスIDの取得方法について
-
ADOでアクセスのレコードに...
-
Visual C++からpingを実行して...
-
非表示になったエクセルは?
-
SendMessageが失敗するときがある
-
OSPFでプロセスを分ける意義に...
-
sleep関数の精度について
-
vb.netでEXCEL起動がうまくでき...
-
C++のプログラムをバックグラウ...
-
C++でシェルを起動
おすすめ情報