2010-11-26 63 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值作为参数子程序开始。那个子程序如何得到第二次机会看看布尔值?它只能“看到”一次价值,当时它是错误的。这是一个范围问题。