задержка выезда в vb.net - PullRequest
       33

задержка выезда в vb.net

0 голосов
/ 09 апреля 2011

У меня есть форма, в которой мне нужно дать задержку в 3 секунды перед выполнением каждой строки.Но когда я пытаюсь использовать system.threading.thread.sleep, он замораживает пользовательский интерфейс и, кроме того, все задержки выполняются как одна задержка.то есть

если у меня есть

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

, пользовательский интерфейс полностью зависает на 15 секунд, а затем все выполнение g происходит мгновенно, как если бы между ними не было оператора задержки.Я не смог найти ничего, кроме threading.sleep.

Ответы [ 5 ]

2 голосов
/ 09 апреля 2011

Что сказал Рон:

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
1 голос
/ 22 мая 2012

встроенное решение, без многопоточности, без таймеров.

    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
0 голосов
/ 09 апреля 2011

Попробуйте выполнить следующее:

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

Application.DoEvents сообщает процессу ОС, лежащему в основе работы, такой как обновление текстового значения.

0 голосов
/ 09 апреля 2011
label.text = "intializing..."
label.Refresh
sleep(5000)
label1.text = "connectinh..."
label1.Refresh
sleep(5000)
label2.text = "connected..."
label2.Refresh
sleep(5000)

Я думаю, что это должно работать более правильно, чем DoEvents!

0 голосов
/ 09 апреля 2011

Вам необходимо обновить каждую метку в отдельном событии и позволить ей обновлять пользовательский интерфейс.Создайте таймер, который будет вызывать ваш обработчик событий, и каждый раз обновляйте новую метку

...