私は、私のUIフォームで開始と停止の2つのボタンを持っています。私はメソッドのクラス名プログラムでいくつかの機能を実行する無限ループを1つ持っています。ユーザーはこのメソッドを呼び出して無限ループを実行し、ユーザーが停止ボタンをクリックするとこの無限ループを解除する必要があります。その後、この無限ループからブレークしてボタン停止クリック内のコードに入ります。 Application.DoEvents()
メソッドを使用しようとしていますが、無限ループコードがスタートボタンのクリックの内側にある場合はうまくいきますが、無限ループコードが私のプログラムで作成された新しいクラスにある場合、 Application.DoEvents()
この無限ループから脱出する方法。私の無限ループを中断する
例:
namespace inFiniteLoopTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
bool stopBtnClk = false;
bool startBtnClk = false;
private void StartBtn_Click(object sender, EventArgs e)
{
stopBtnClk=false;
startBtnClk = true;
while(true)
{
//some code to be executed
Application.DoEvents();
if (stopBtnClk == true)
{
break;
}
}
}
private void StopBtn_Click(object sender, EventArgs e)
{
stopBtnClk = true;
if (startBtnClk == true)
{
//Application.Exit();
MessageBox.Show("success");
}
}
これがうまく機能しています。
しかし
public class programs
{
public static void infiniteLoop(bool stopBtnClick)
{
while(true)
{
//some code to be executed
Application.DoEvents();
if (stopBtnClk == true)
{
break;
}
}
}
}
//and my UI code to call this class is
namespace inFiniteLoopTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
bool stopBtnClk = false;
bool startBtnClk = false;
private void StartBtn_Click(object sender, EventArgs e)
{
stopBtnClk=false;
startBtnClk = true;
programs.infiniteLoop(stopBtnClk);
}
private void StopBtn_Click(object sender, EventArgs e)
{
stopBtnClk = true;
if (startBtnClk == true)
{
//Application.Exit();
MessageBox.Show("success");
}
}
}
が、これは動作しません。
停止ボタンがクリックされたときにコンパイラが「成功」というメッセージを表示したにもかかわらず、デバッガがまだ自分のフォームで実行していると言っても。 私の質問がはっきりしていることを願っています。 そして、私はあなたに私の質問にできるだけ早く答えて、この問題を取り除くようお願いしています。 特にスレッドに参加した場合、私は公然と答えを受け入れます。
私はC#の初心者ですが、私はそれを続ける必要があります。
ありがとうございました!
なぜこの質問がC#にのみ関連するのであれば、[Java]、[PHP]、[C++]、および[C] (私は適切なタグだけを含むように編集しました)。 –
コードを再フォーマットしてください。ブロック全体を選択し、その上に「コードサンプル」機能を使用するか、2回実行する必要があるかもしれませんが、最終的にどのように見えるかのプレビューも表示されます。 – Mephane
作業を行うにはスレッドを使用する必要があります。 – MrFox