2010-05-24 78 views
1

新手在这里。我有这样的代码:暂停执行并运行,直到表单被点击

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

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

+1

你想要什么反复运行,直到用户单击表单? – 2010-05-24 18:11:12

+0

实际上,当v达到360时,v被重置为0,所以我没有很好地说明问题。我希望这个代码用它自己的小方法继续运行,直到用户单击表单或按下一个键。 – jimmy 2010-05-24 18:28:15

+0

RunIt()做什么? – 2010-05-24 18:36:30

回答

2

如果你想do等你半秒钟可以加

Thread.Sleep(500); 
+0

谢谢!很简单,我想,但我仍然在学习这些东西。这解决了这个问题,但我仍然有重复这个问题,直到用户点击表单。有什么建议么?我尝试过使用表单的单击事件,但这使得C#真的很疯狂。击键会一样好。 – jimmy 2010-05-24 18:19:41

2

您可以使用Thread.Sleep

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

}

1

在Windows窗体应用程序,你可以等待的时间量与此:

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

好吧,所以我刚刚尝试使用Thread.Sleep(500)方法,它似乎没有做什么吉米最初要求。也许我做错了,但它似乎阻止线程并导致窗体被锁定,因此用户不能点击任何窗体按钮或其他任何东西。最后,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(); 
    } 
} 
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(); 
} 

这里有一些事情阅读:

+0

感谢所有回复的人。 Patko,你的建议绝对会给我一些东西来咀嚼。 Application.DoEvents看起来很有希望。我会阅读那篇文章。 – jimmy 2010-05-24 20:35:24

+0

Application.DoEvents()做了诀窍。谢谢! – jimmy 2010-05-25 10:19:04

0

这里是我的代码修改后的版本,它使用Application.DoEvents的Patko的建议()。请注意,从构造函数中启动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(); 
    } 
}