暂停执行并运行直到单击表单

时间:2010-05-24 18:07:53

标签: c#

新手在这里。我有这段代码:

while (v < 360)
{
    v +=10;
    RunIt();
    // need to wait half a second here
}

如何等待1/2秒?此外,如果这不是要求太多,我希望重复运行,直到用户点击表单。提前谢谢。

6 个答案:

答案 0 :(得分:2)

您可以使用Thread.Sleep

while (v < 360)
{
  v +=10;
  RunIt();
  //  wait half a second here
  Thread.Sleep(500);

}

答案 1 :(得分:2)

如果您只想等半秒钟,可以添加

Thread.Sleep(500);

答案 2 :(得分:1)

在Windows窗体应用程序中,您可以等待一段时间:

System.Threading.Thread.Sleep(500);  // Waits for 1/2 second.

答案 3 :(得分:1)

好的,所以我刚尝试使用Thread.Sleep(500)方法,它似乎没有按照jimmy最初的要求做。也许我做错了,但它似乎阻止了线程并导致表单被锁定,因此用户无法单击任何表单按钮或其他任何内容。最后,Windows将表单显示为无响应。

由于目标是在用户单击表单(或表单上的特定控件)之前运行,因此我认为前进的方法是使用计时器对象。下面是我将使用的实现示例。我有一个标准表格,并添加了一个按钮和一个标签。标签显示v的值,每半秒更新一次,直到用户点击按钮。单击该按钮时,该按钮的事件处理程序将停止计时器,从而停止调用RunIt()。

无需“使用System.Threading;”因为我们使用的是System.Windows.Forms.Timer。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        runItTimer.Interval = 500;
        runItTimer.Tick += new EventHandler(runItTimer_Tick);
        runItTimer.Start();
    }

    private System.Windows.Forms.Timer runItTimer = new System.Windows.Forms.Timer();

    private int v = 0;

    void runItTimer_Tick(object sender, EventArgs e)
    {
        v += 10;
        RunIt();
        if (v == 360) { v = 0; }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        runItTimer.Stop();
    }

    private void RunIt()
    {
        label1.Text = v.ToString();
        Refresh();
    }
}

答案 4 :(得分:0)

你有问题的第一部分,Thread.Sleep。

至于第二部分,你应该熟悉winforms的工作原理。每个UI线程都有自己的消息队列。然后将消息分派到处理它们的适当形式。消息可以指示表单必须自己绘制,按下按键等等。此队列的处理与您的代码在同一个线程上,因此如果您有一个无限循环,那么您将阻止消息队列并且无法处理新消息。这意味着表单不会响应任何事件。要解决这个问题,你必须选择。一种是在后台线程上运行RunIt方法,另一种是强制处理消息队列。前一种方法可能会更好,但一开始你可以试试后者。您可以使用Application.DoEvents方法强制进行消息队列处理。

while (v < 360)
{
    v +=10;
    RunIt();
    Thread.Sleep(500);
    // Enable message queue to process events.
    Application.DoEvents();
}

以下是阅读的一些内容:

答案 5 :(得分:0)

以下是我的代码的修改版本,它使用了Patko对Application.DoEvents()的建议。请注意,从构造函数启动while循环可以阻止窗体显示在屏幕上。为了解决这个问题,我从Form1_Shown事件开始了while循环。可能还有其他方法来解决这个问题。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        //RunMeTillSomeoneClicks(); // !!! Stops the form from being shown.
    }

    private void Form1_Shown(object sender, EventArgs e)
    {
        RunMeTillSomeoneClicks();
    }

    private bool keepOnRunning = true;

    private void RunMeTillSomeoneClicks()
    {
        int v = 0;
        while (keepOnRunning && (v < 360))
        {
            v += 10;
            RunIt(v);
            System.Threading.Thread.Sleep(500);
            if (v == 360) { v = 0; }
            Application.DoEvents();
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        keepOnRunning = false;
    }

    private void RunIt(int v)
    {
        label1.Text = v.ToString();
        Refresh();
    }
}