2010-11-26 85 views
0

我有兩個按鈕一個用於開始和一個停止在我的UI形式,我有一個無限循環,執行一些函數在我的班級名稱程序中的一個方法。單擊開始按鈕用戶調用這個方法來執行無限循環,當用戶點擊停止按鈕時,我需要打破這個無限循環,之後我的編譯器將跳出這個無限循環並進入按鈕停止點擊中的代碼。 我想用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#的初學者,但我需要繼續。

謝謝!

+2

如果這個問題只涉及到C#,爲什麼你把這個問題標記爲`[java]`,`[php]`,`[C++]`和`[c]`? (我編輯它只包含適當的標籤)。 – 2010-11-26 12:03:14

+0

請重新格式化代碼。選擇整個模塊,並使用其上的「代碼示例」功能,可能必須執行兩次,您還會看到最終模樣的預覽。 – Mephane 2010-11-26 12:04:25

+0

你應該使用一個線程來完成這項工作。 – MrFox 2010-11-26 12:14:59

回答

0

您提供的代碼是真的很難讀,但至於當你創建你的無限循環,我可以看到這樣做:while(looping) // do stuff

然後,當你按下停止按鈕設置布爾變量循環設置爲false,它將跳出循環並顯示消息。

0

爲什麼不使用無限循環而是使用按鈕確定的開始停止條件?

我想你可以有一個變量,只是把它

bool stop_loop = false 

和你的循環

while(!stop_loop){ //CODE HERE } 

現在,當你點擊第一個按鈕(開始)調用方法(無論它是)開始循環。直到您點擊按鈕停止並且stop_loop的值變爲True,循環纔會顯得無窮無盡。

HTH

7

不要屏蔽GUI線程。您必須使用Application.DoEvents()更新GUI的事實是糟糕設計的一個指標。在單獨的工作線程中完成工作。

BackgroundWorker是預定這樣的任務。您infiniteLoop方法這樣

0

更改簽名:

public static void infiniteLoop(ref bool stopBtnClick) ...

0

在第二代碼片段,無限循環在接受boolean值作爲參數子程序開始。那個子程序如何得到第二次機會看看布爾值?它只能「看到」一次價值,當時它是錯誤的。這是一個範圍問題。