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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
36 763
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

@Mitchel Я попытался показать форму, и после того, как форма была показана, пусть он запустит мой код для инициализации кодировщика ... Единственная проблема заключалась в том, что он не загружал мою этикетку с надписью Loading до тех пор, пока кодировщик не был инициализирован.

pixeldev 31.12.2008 18:51

@Bruno - это связано с блокировкой потока пользовательского интерфейса, как я уже упоминал. Вызов Application.DoEvents () должен обойти это. В противном случае лучше всего подойдет многопоточный подход с использованием Background Worker.

Mitchel Sellers 31.12.2008 18:55

Вы можете попробовать две вещи.

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

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

Есть какие-нибудь хорошие примеры фоновых рабочих процессов? Я сейчас гуглию;)

pixeldev 31.12.2008 18:55

Это стандартный компонент, хороший пример см. В ответе OwenP.

Tom Anderson 31.12.2008 19:00
Ответ принят как подходящий

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

pixeldev 31.12.2008 19:04

Другие вопросы по теме