2011-04-09 36 views
-1

我有一個表單,我需要在每行執行前給3秒的時間延遲。但是當我嘗試system.threading.thread.sleep時,它凍結了用戶界面,而且所有延遲都作爲一個延遲執行。 是在vb.net中留下時間延遲

,如果我有

label.text = "intializing..." 
sleep(5000) 
label1.text = "connectinh..." 
sleep(5000) 
label2.text = "connected..." 
sleep(5000) 

的UI凍結15秒完全,然後好像有他們之間沒有延遲語句的所有executiong發生在瞬間。除了threading.sleep,我無法找到其他任何東西。

+2

說「這是緊急的」不會讓你更快的答案。充其量,人們會忽略它;在最壞的情況下,它會刺激他們,他們會停止閱讀...... – 2011-04-09 01:35:49

+0

它只是一個形容詞,我不知道爲什麼脂肪酶必須讓它變得惱火。我清楚地解釋了我的問題,並說它是緊急的。我不認爲它沒有錯。 – swordfish 2011-04-10 04:29:40

回答

2

什麼羅恩說:

Private Sub Form1_Shown(sender As Object, _ 
         e As System.EventArgs) Handles Me.Shown 
    Dim t As New Threading.Thread(AddressOf showLabelText) 
    t.IsBackground = True 
    t.Start() 
End Sub 

Const delaySecs As Integer = 3 

Private Sub showLabelText() 
    Dim del As New foo(AddressOf updLabel) 

    Label1.BeginInvoke(del, "one") 
    Threading.Thread.Sleep(delaySecs * 1000) 

    Label1.BeginInvoke(del, "two") 
    Threading.Thread.Sleep(delaySecs * 1000) 

    Label1.BeginInvoke(del, "three") 
    Threading.Thread.Sleep(delaySecs * 1000) 

End Sub 

Delegate Sub foo(theText As String) 

Private Sub updLabel(theText As Object) 
    Label1.Text = DirectCast(theText, String) 
End Sub 
+0

其實這就是我所做的,以稍微修改的方式 – swordfish 2011-04-10 04:31:07

0

您需要將每個標籤更新到單獨的事件中並讓其刷新UI。 創建一個計時器會打電話給你的事件處理程序,並在它的每一次更新不同的標籤

0

嘗試以下操作:

label.text = "intializing..." 
Application.DoEvents 
sleep(5000) 
label1.text = "connectinh..." 
Application.DoEvents 
sleep(5000) 
label2.text = "connected..." 
Application.DoEvents 
sleep(5000) 

Application.DoEvents告訴操作系統進程的基本工作,比如更新文本值。

0
label.text = "intializing..." 
label.Refresh 
sleep(5000) 
label1.text = "connectinh..." 
label1.Refresh 
sleep(5000) 
label2.text = "connected..." 
label2.Refresh 
sleep(5000) 

我認爲這應該比DoEvents更正確地工作!

1

內嵌解決方案,不需要多線程,沒有計時器。

Sub delay(ByVal delay_ms As Integer) 
     Dim tspan As New TimeSpan 
     Dim tstart = Now 
     While tspan.TotalMilliseconds < delay_ms 
      tspan = Now - tstart 
      Application.DoEvents() 
     End While 
    End Sub 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Label1.Text = "Hello" 
     delay(100) 'leaks 572 ns every 10 ms 
     Label1.Text = "Salut" 
    End Sub