2011-08-10 157 views
1

我正在创建一个模拟掷骰子的小应用程序。为了模拟反弹,我随机更改图片的位置。现在为了模拟多次反弹,我使用了for循环来连续改变图片框的位置。但是这并没有按照我的计划进行,表格只显示了最后一个循环的位置。我甚至尝试使用System.Threading.Thread.Sleep(1000)希望显示反弹,但即使他们只显示最后一个循环。如何暂停执行几秒钟并继续循环?

For bounceCount As Integer = 1 To bounces 
    bounce(pb_dice1) 
    bounce(pb_dice2) 
    System.Threading.Thread.Sleep(3000) 'I need to pause here and show the recent change in position then continue after 3 seconds 
Next 

bounce方法改变PictureBox的位置。

如何暂停我的循环,显示新定位的骰子,然后在3秒后继续?

回答

5

直到事件处理程序完成执行,控件才刷新其图形。否则,如果对一个或多个控件进行了一些更改,当您真正想要的只是最终结果时,它们会重复刷新。

要强制控制刷新它的图形,你需要睡觉前插入以下行:

PictureBox1.Refresh() 

您可能需要更改PictureBox1到另一个控件的名字,当然。此外,它可能是值得刷新父控制(即控制包含骰子)。

+0

伟大的工作 – mrN

2

我想你应该在致电Sleep()之前使用Application.DoEvents()

+0

同意+1,调用'Application.DoEvents()'让消息泵通过任何绘图请求工作。当我不想将线程引入一个简单的过程时,我已经多次使用过这种技术。 – ckittel

+0

'Application.DoEvents()'当然是有用的,但它也允许用户点击其他可能严重干扰或混淆长时间运行的按钮和控件。如果您使用该方法,则必须格外小心您的代码是健壮的。 Control.Refresh()的缺点是窗口显示为“Not Responding”,无法以任何方式操作。 –

+0

这比Control.Refresh()更好吗? – mrN