2015-07-24 3 views
0

Когда я запускаю программу и пытаюсь нажать кнопку паузы, ничего не происходит. Я не уверен, как я могу заставить это работать точно. У меня есть переменная bool, называемая паузой, а для паузы установлено значение false. Как только нажата кнопка паузы, она должна установить для этой переменной значение true. Затем цикл проверяет это и должен отображать сообщение пользователю. Любая помощь очень ценится!Как приостановить цикл, когда нажата кнопка паузы?

namespace Practice2 
{ 
    public partial class Form1 : Form 
    { 
    photocopier printer = new photocopier(500, 2500); 
    bool pause = false; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    private void btnStart_Click(object sender, EventArgs e) 
    { 

     if (checkText(txtNumberCopies.Text) == true) 
     { 
      int numberCopies = Convert.ToInt32(txtNumberCopies.Text); 
      int toner = Convert.ToInt32(lblTonerAmount.Text); 
      int paperCapacity = Convert.ToInt32(lblPaperAmount.Text); 

      if (toner <= 625 && paperCapacity <= 125) 
      { 
       txtMessage.Text = "Printer is low on Toner and Paper!"; 
      } 
      else if (toner <= 625){ 
       txtMessage.Text = "Printer Toner is low!"; 
      } 
      else if (paperCapacity <= 125) 
      { 
       txtMessage.Text = "Printer Paper is low!"; 
      } 
      else 
      { 
       txtMessage.Text = "Printing..."; 
       txtMessage.Refresh(); 
       for (int i = numberCopies; i != 0; i--) 
       { 
        int paper = Convert.ToInt32(lblPaperAmount.Text); 
        paper--; 
        if (paper == 480 || paper == 380 || paper == 400 || paper == 200) 
        { 
         MessageBox.Show("There is a paper Jam! Please remove the Jam and then hit the ok button to continue!", "Important Message", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 

        } 

        if (pause == true) 
        { 
         MessageBox.Show("Press the ok button when ready to continue", "Important Message", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
        } 
        lblPaperAmount.Text = Convert.ToString(Convert.ToInt32(lblPaperAmount.Text) - 1); 
        lblTonerAmount.Text = Convert.ToString(Convert.ToInt32(lblTonerAmount.Text) - 1); 
        Thread.Sleep(1000); 
       } 
       txtMessage.Text = "Job is completed!"; 
      } 

     } 
    } 

    private void btnAddPaper_Click(object sender, EventArgs e) 
    { 
     int paperAmount = Convert.ToInt32(lblPaperAmount.Text); 
     if (checkText(txtAddPaper.Text) == true && paperAmount <= 500) 
     { 
      lblPaperAmount.Text = Convert.ToString(paperAmount + Convert.ToInt32(txtAddPaper.Text)); 
     } 
     else 
     { 
      txtMessage.Text = "Printer paper is at capacity!"; 
     } 
    } 

    private bool checkText(string textBox) 
    { 
     if (textBox.Equals("") || textBox == null) 
     { 
      txtMessage.Text = "Please enter a value in the text box!"; 
      return false; 
     } 
     return true; 
    } 

    private void btnReplaceToner_Click(object sender, EventArgs e) 
    { 
     lblTonerAmount.Text = Convert.ToString(printer.Toner); 
    } 

    private void btnPauseCancel_Click(object sender, EventArgs e) 
    { 
     pause = true; 

    } 
} 
} 
+0

Что я думаю, что вы говорите, вы нажимаете btnStart, затем, пока он идет, вы нажимаете btnPauseCancel и ожидаете, что он приостановит печать. Это верно? – DrewJordan

+0

@DrewJordan Да, это правильно –

ответ

2

Проблема заключается в том, что вы делаете работу в потоке пользовательского интерфейса, так что поток пользовательского интерфейса занят и не может обрабатывать сообщения (например, кнопка щелчка). Вам нужно сделать работу над рабочим потоком, используя, например, BackgroundWorker или Task.Run.

+1

У вас есть пример того, как это использовать? –

+1

@TylerStokes, есть буквально тысячи примеров в Интернете ... –

+0

@TylerStokes Мой ответ немного проще. – Sweeper

1

А для цикла находится в потоке пользовательского интерфейса, поэтому, пока цикл for работает, вы не можете ничего сделать с пользовательским интерфейсом. Я предлагаю вам использовать System.Windows.Forms.Timer, чтобы выполнить эту работу. Вы устанавливаете интервал в 1, и это будет работать довольно быстро, но не так быстро, как цикл for. Но вам достаточно интервала = 1.

Позвольте мне показать вам:

Timer timer = new Timer() {Interval=1}; 

создать новый объект таймера. введите

timer.Tick += 

в Constructer и нажмите TAB дважды, и это должно создать обработчик событий. Напишите материал, который вы хотите сделать в обработчике событий. Вызвать timer.Stop, чтобы приостановить таймер, и timer.Start, чтобы запустить таймер.

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