在vb.net中显示加载屏幕

时间:2008-12-31 15:26:16

标签: vb.net visual-studio visual-studio-2005

我需要显示一个屏幕或其他内容,在长时间处理过程中说“正在加载”等等。

我正在使用Windows Media Encoder SDK创建应用程序,初始化编码器需要一段时间。我希望屏幕在启动编码器时弹出说“正在加载”,然后在编码器完成后它会消失并且可以继续使用应用程序。

任何帮助将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:9)

创建一个将用作“加载”对话框的表单。当您准备初始化编码器时,使用ShowDialog()方法显示此表单。这导致它阻止用户与显示加载对话框的表单进行交互。

加载对话框应该以这样的方式编码:加载时,它使用BackgroundWorker在单独的线程上初始化编码器。这可确保加载对话框保持响应。以下是对话框表单的示例:

Imports System.ComponentModel

Public Class LoadingForm ' Inherits Form from the designer.vb file

    Private _worker As BackgroundWorker

    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        MyBase.OnLoad(e)

        _worker = New BackgroundWorker()
        AddHandler _worker.DoWork, AddressOf WorkerDoWork
        AddHandler _worker.RunWorkerCompleted, AddressOf WorkerCompleted

        _worker.RunWorkerAsync()
    End Sub

    ' This is executed on a worker thread and will not make the dialog unresponsive.  If you want
    ' to interact with the dialog (like changing a progress bar or label), you need to use the
    ' worker's ReportProgress() method (see documentation for details)
    Private Sub WorkerDoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
        ' Initialize encoder here
    End Sub

    ' This is executed on the UI thread after the work is complete.  It's a good place to either
    ' close the dialog or indicate that the initialization is complete.  It's safe to work with
    ' controls from this event.
    Private Sub WorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
        Me.DialogResult = Windows.Forms.DialogResult.OK
        Me.Close()
    End Sub

End Class

而且,当你准备好显示对话框时,你会这样做:

Dim frm As New LoadingForm()
frm.ShowDialog()

有更优雅的实现和更好的实践可以遵循,但这是最简单的。

答案 1 :(得分:0)

有很多方法可以做到这一点。最简单的可能是显示一个模态对话框,然后启动另一个进程,一旦完成,然后关闭显示的对话框。您需要处理标准X的显示才能关闭。但是,在标准UI线程中执行此操作会锁定UI,直到操作完成。

另一种选择可能是使用“加载”屏幕填充默认表单,将其置于前面,然后在辅助线程上触发长时间运行的进程,一旦完成,您可以通知UI线程并删除加载屏幕。

这只是一些想法,它实际上取决于你在做什么。

答案 2 :(得分:0)

你可以尝试两件事。

设置标签后(如评论中提到的Mitchel),请致电Application.DoEvents()

另一个选项是在BackgroundWorker进程中运行编码器的初始化代码。