2010-11-26 7 views
0

У меня есть две кнопки для начала и одна для остановки в моей форме пользовательского интерфейса, и у меня есть один бесконечный цикл, который выполняет некоторую функцию в моих программах имен классов в методе. Кнопка запуска нажата пользователь вызывает этот метод для выполнения бесконечного цикла, и мне нужно разбить этот бесконечный цикл, когда пользователь нажимает кнопку остановки, после чего мой компилятор вырвется из этого бесконечного цикла и войдет в код внутри кнопки stop click. Я пытаюсь использовать метод 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

Почему вы отмечаете этот вопрос как `[java]`, `[php]`, `[C++]` и `[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

Затем при нажатии на кнопке Стоп установить переменную Ее зацикливание ложь, и это выйдет из цикла и покажет сообщение.

0

Почему вместо бесконечного цикла вы используете условие остановки запуска, определяемое кнопками?

Я думал, вы можете иметь переменную, просто вызовите его

bool stop_loop = false 

и ваш цикл

while(!stop_loop){ //CODE HERE } 

Теперь при нажатии на первую кнопку (Start) вызывается метод (там, где это), чтобы запустить цикл. Цикл будет казаться бесконечным, пока вы не нажмете кнопку остановки, а значение stop_loop станет в True.

HTH

7

Не блокируйте резьбу графического интерфейса пользователя. Тот факт, что вы должны использовать Application.DoEvents() для обновления GUI, является индикатором плохого дизайна. Выполняйте работу в отдельном рабочем потоке.

BackgroundWorker предопределен для выполнения такой задачи.

0

Изменить подпись вашего метода infiniteLoop как это:

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

0

Во втором фрагменте кода бесконечный цикл начинается в подпрограмме, которая принимает логическое значение в качестве параметра. Как эта подпрограмма получает второй шанс взглянуть на это логическое? Он только «видит» значение один раз, и в то время он ошибочен. Это предметный вопрос.

Смежные вопросы