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





Есть много способов сделать это. Самым простым может быть отображение модального диалогового окна, а затем запуск другого процесса, после его завершения вы закрываете отображаемое диалоговое окно. Однако вам нужно будет обработать отображение стандартного X, чтобы закрыть. Однако выполнение всего этого в стандартном потоке пользовательского интерфейса заблокирует пользовательский интерфейс до завершения операции.
Другой вариант может заключаться в том, чтобы иметь экран «загрузки», который заполняет вашу форму по умолчанию, выводит его на передний план, а затем запускает длительный процесс во вторичном потоке, после его завершения вы можете уведомить поток пользовательского интерфейса и удалить экран загрузки.
Это всего лишь несколько идей, и все зависит от того, что вы делаете.
@Bruno - это связано с блокировкой потока пользовательского интерфейса, как я уже упоминал. Вызов Application.DoEvents () должен обойти это. В противном случае лучше всего подойдет многопоточный подход с использованием Background Worker.
Вы можете попробовать две вещи.
После установки вашей метки (как указано в комментарии к Митчелу) позвоните Application.DoEvents()
Другой вариант - запустить код инициализации кодировщика в процессе BackgroundWorker.
Есть какие-нибудь хорошие примеры фоновых рабочих процессов? Я сейчас гуглию;)
Это стандартный компонент, хороший пример см. В ответе OwenP.
Создайте форму, которая будет служить диалогом «Загрузка». Когда вы будете готовы инициализировать кодировщик, отобразите эту форму с помощью метода 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()
Есть более элегантные реализации и лучшие практики, но это самый простой.
Именно то, что я искал. @Mitchel @Tom Anderson Спасибо за помощь! Всякий ответ мне действительно помог!
@Mitchel Я попытался показать форму, и после того, как форма была показана, пусть он запустит мой код для инициализации кодировщика ... Единственная проблема заключалась в том, что он не загружал мою этикетку с надписью Loading до тех пор, пока кодировщик не был инициализирован.