Показать экран загрузки в vb.net

Мне нужно показать экран или что-то еще, говоря «Загрузка» или что-то еще, пока работает длительный процесс.

Я создаю приложение с помощью SDK Windows Media Encoder, и для инициализации кодировщика требуется некоторое время. Я хотел бы, чтобы во время запуска кодировщика появлялся экран с надписью «Загрузка», а затем он исчезал, когда кодировщик завершал работу, и они могли продолжить работу с приложением.

Любая помощь будет оценена по достоинству. Спасибо!


person pixeldev    schedule 31.12.2008    source источник


Ответы (3)


Создайте форму, которая будет служить диалоговым окном «Загрузка». Когда вы будете готовы инициализировать кодировщик, отобразите эту форму с помощью метода 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()

Есть более элегантные реализации и лучшие практики, но это самое простое.

person OwenP    schedule 31.12.2008
comment
Именно то, что я искал. @Mitchel @Tom Anderson Спасибо за помощь! Все ответы действительно помогли мне! - person pixeldev; 31.12.2008

Есть много способов сделать это. Самым простым может быть отображение модального диалога, затем запуск другого процесса, после его завершения вы закрываете отображаемый диалог. Однако вам нужно будет обработать отображение стандартного X, чтобы закрыть его. Однако выполнение всего этого в стандартном потоке пользовательского интерфейса заблокирует пользовательский интерфейс до завершения операции.

Другим вариантом может быть экран «загрузки», который заполняет вашу форму по умолчанию, выводит ее на передний план, затем запускает длительный процесс во вторичном потоке, после его завершения вы можете уведомить поток пользовательского интерфейса и удалить экран загрузки.

Это всего лишь несколько идей, и это действительно зависит от того, что вы делаете.

person Mitchel Sellers    schedule 31.12.2008
comment
@Mitchel Я пытался показать форму, и после того, как форма была показана, она запускала мой код для инициализации кодировщика ... Единственная проблема заключалась в том, что он не загружал мою метку с надписью «Загрузка» до тех пор, пока кодировщик не был инициализирован. - person pixeldev; 31.12.2008
comment
@Bruno - это связано с блокировкой потока пользовательского интерфейса, как я уже упоминал. Вызов Application.DoEvents() должен обойти это. В противном случае лучше всего подойдет многопоточный подход с использованием Background Worker. - person Mitchel Sellers; 31.12.2008

Две вещи, которые вы можете попробовать.

После установки метки (как указано в комментарии Митчелу) вызовите Application.DoEvents()

Другой вариант, который у вас есть, — запустить код инициализации кодировщика в процессе BackgroundWorker.

person Tom Anderson    schedule 31.12.2008
comment
Есть хорошие примеры фоновых рабочих процессов? Я сейчас гуглю ;) - person pixeldev; 31.12.2008
comment
Это стандартный компонент, хороший пример см. в ответе OwenP. - person Tom Anderson; 31.12.2008