【问题标题】:How to pause for loop when pause button is clicked?单击暂停按钮时如何暂停循环?
【发布时间】:2015-07-24 09:21:04
【问题描述】:

当我运行程序并尝试单击暂停按钮时,没有任何反应。我不确定如何才能让它完全正常工作。我有一个名为 pause 的 bool 变量,pause 设置为 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;

    }
}
}

【问题讨论】:

  • 我认为您的意思是,您单击 btnStart,然后在运行过程中单击 btnPauseCancel 并期望它暂停打印。对吗?
  • @DrewJordan 是的,这是正确的

标签: c# .net


【解决方案1】:

问题是您正在 UI 线程上执行工作,因此 UI 线程很忙,无法处理消息(例如按钮单击)。您需要在工作线程上完成工作,例如使用 BackgroundWorkerTask.Run

【讨论】:

  • 你有如何使用它的例子吗?
  • @TylerStokes 我的回答比较容易理解。
【解决方案2】:

for 循环位于 UI 线程上,因此当 for 循环运行时,您无法对 UI 执行任何操作。我建议您使用System.Windows.Forms.Timer 来完成这项工作。您将间隔设置为 1,它会运行得非常快,但不会像 for 循环那样快。但是interval = 1对你来说已经足够了。

让我告诉你:

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

创建一个新的计时器对象。 进入

timer.Tick +=

在构造函数中按 TAB 两次,这应该会生成一个事件处理程序。在事件处理程序中写下你想做的事情。 调用timer.Stop 暂停定时器,调用timer.Start 启动定时器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多