新手在这里。我有这样的代码:暂停执行并运行,直到表单被点击
while (v < 360)
{
v +=10;
RunIt();
// need to wait half a second here
}
如何等待1/2秒?另外,如果这不要求太多,我希望这个重复运行,直到用户点击表单。提前致谢。
新手在这里。我有这样的代码:暂停执行并运行,直到表单被点击
while (v < 360)
{
v +=10;
RunIt();
// need to wait half a second here
}
如何等待1/2秒?另外,如果这不要求太多,我希望这个重复运行,直到用户点击表单。提前致谢。
如果你想do等你半秒钟可以加
Thread.Sleep(500);
谢谢!很简单,我想,但我仍然在学习这些东西。这解决了这个问题,但我仍然有重复这个问题,直到用户点击表单。有什么建议么?我尝试过使用表单的单击事件,但这使得C#真的很疯狂。击键会一样好。 – jimmy 2010-05-24 18:19:41
您可以使用Thread.Sleep
:
while (v < 360)
{
v +=10;
RunIt();
// wait half a second here
Thread.Sleep(500);
}
在Windows窗体应用程序,你可以等待的时间量与此:
System.Threading.Thread.Sleep(500); // Waits for 1/2 second.
好吧,所以我刚刚尝试使用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();
}
}
你得到了第一部分的问题,Thread.Sleep。
至于第二部分,你应该熟悉winforms是如何工作的。每个UI线程都有自己的消息队列。然后将消息发送到处理它们的适当格式。消息可以指示表单必须自己绘制,按下了一个键等等。处理这个队列和你的代码在同一个线程中,所以如果你有一个无限循环,那么你将阻塞消息队列,并且不能处理新的消息。这意味着表单不会响应任何事件。要解决这个问题,你必须选择。一种是在后台线程上运行RunIt方法,另一种是强制处理消息队列。前一种方法可能会更好,但开始时可以尝试后者。您可以使用Application.DoEvents方法强制处理消息队列。
while (v < 360)
{
v +=10;
RunIt();
Thread.Sleep(500);
// Enable message queue to process events.
Application.DoEvents();
}
这里有一些事情阅读:
这里是我的代码修改后的版本,它使用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();
}
}
你想要什么反复运行,直到用户单击表单? – 2010-05-24 18:11:12
实际上,当v达到360时,v被重置为0,所以我没有很好地说明问题。我希望这个代码用它自己的小方法继续运行,直到用户单击表单或按下一个键。 – jimmy 2010-05-24 18:28:15
RunIt()做什么? – 2010-05-24 18:36:30