开发者

VB.net Splash screen not updating

I made a splash screen and want to have some text change on it as different parts of the program are loaded but the screen isnt updating when i use refresh or update.

    Dim splash As New BMSSplash
    splash.Show()

    splash.lblStatus.Text = "Retrieving active users..."
    splash.Refresh()

    buddyList.setuserList()
    System.Threading.Thread.Sleep(5000开发者_开发知识库)  

    splash.lblStatus.Text = "Retrieving bonder info..."
    splash.Refresh()
    GetBonderGeneralAndDeviceList(CurrentBonderSetup)
    System.Threading.Thread.Sleep(5000)

    splash.Close()
    MakeTree(CurrentBonderSetup)


You are best doing all the initialization tasks in a background thread. This will keep your UI responsive.

This answer to a related question has some sample code in C#.

It might be easiest to use a BackgroundWorker for that task (simply drag the BackroundWorker component onto your form). Using a BackgroundWorker you can also easily report the percentage of the initialization that is already done, e.g. to be displayed in a progress bar.

Public Class Form1
    Private splash As BMSSplash

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        splash = New BMSSplash
        splash.Show()

        BackgroundWorker1.WorkerReportsProgress = True
        BackgroundWorker1.RunWorkerAsync()
    End Sub    

    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, 
        ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

        Dim percentageCompleted As Integer

        BackgroundWorker1.ReportProgress(percentageCompleted, 
            "Retrieving active users...")

        ' replace the sleeps with the longer-running init task
        System.Threading.Thread.Sleep(5000)

        BackgroundWorker1.ReportProgress(percentageCompleted, 
            "Retrieving bonder info...")

        System.Threading.Thread.Sleep(5000)
    End Sub

    Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As System.Object, 
        ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged

        Dim message As String = e.UserState
        splash.lblStatus.Text = message
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, 
        ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted

        splash.Close()
    End Sub
End Class


divo had a good suggestion. However, one thing stands out in your original question.

If the "splash" screen is displaying and hiding very quickly then I'd suggest getting rid of it altogether.

If you forsee those functions taking a bit of time then you are far better off loading the base app and allowing the user to get in as quickly as possible. Then spool off different threads to load additional resources as necessary.

For example, show a somewhat empty screen then have your buddy list start appearing as the data is loaded. Same thing for the Bonder Device List.

This results in much happier users who think your app runs faster than it actually does.


I did this and it didnt work. Actually now my GetBonderGeneralAndDeviceList function does not work properly,

Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    splash = New BMSSplash
    splash.Show()

    BackgroundWorker1.WorkerReportsProgress = True
    BackgroundWorker1.RunWorkerAsync()

    MakeTree(CurrentBonderSetup)

End Sub


Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

    Dim percentageCompleted As Integer

    percentageCompleted = 30
    BackgroundWorker1.ReportProgress(percentageCompleted, "Retrieving active users...")
    buddyList.setuserList()
    System.Threading.Thread.Sleep(5000)

    percentageCompleted = 70
    BackgroundWorker1.ReportProgress(percentageCompleted, "Retrieving bonder info...")
    GetBonderGeneralAndDeviceList(CurrentBonderSetup)

End Sub


Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged

    Dim message As String = e.UserState
    splash.lblStatus.Text = message

End Sub


Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    splash.Close()
End Sub
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜