2011-08-10 220 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