2014-09-29 2 views
1

Хотя у меня есть Опыт VBScript, это моя первая попытка создать очень простую оболочку VB.NET (приложение Windows Forms Application) для приложения командной строки. Пожалуйста, будь добр!VB.NET Marquee Progress До выхода процесса

У меня очень простой графический интерфейс с двумя кнопками, которые выполняют оба действия, и я хотел бы показать индикатор выполнения шага до тех пор, пока действие (чтение: процесс) не будет завершено (читайте: выходы).

Кнопка 'Сохранить' делает это:

Dim SaveEXE As Process = Process.Start("save.exe", "/whatever /arguments") 


Оттуда я начинаю шатер прогресс бар:

ProgressBar1.Style = ProgressBarStyle.Marquee 
ProgressBar1.MarqueeAnimationSpeed = 60 
ProgressBar1.Refresh() 


Я думал, что я мог бы использовать SaveEXE.WaitForExit() но Marquee начинается , затем останавливается посередине, пока процесс не завершится. Не очень полезно для тех, кто смотрит; они подумают, что он висел.


Я подумал, что я мог бы сделать что-то вроде этого, но что вызывает мое приложение VB.Net к сбою

Do 
    ProgressBar1.Style = ProgressBarStyle.Marquee 
    ProgressBar1.MarqueeAnimationSpeed = 60 
    ProgressBar1.Refresh() 
Loop Until SaveEXE.ExitCode = 0 
ProgressBar1.MarqueeAnimationSpeed = 60 
ProgressBar1.Refresh() 


Я не совсем уверен, что должно быть сделано, не хватает какой-то получать формальное обучение ,

+0

Вместо этого используйте событие «Выход». Назначьте SynchronizingObject, чтобы сделать его безопасным. –

ответ

3

Вы можете использовать новый Асинхронный/ОЖИДАНИЕ Особенность .NET 4.5 для этого:

Public Class Form1 
    Private Async Sub RunProcess() 
     ProgressBar1.Visible = True 
     Dim p As Process = Process.Start("C:\test\test.exe") 
     Await Task.Run(Sub() p.WaitForExit()) 
     ProgressBar1.Visible = False 
    End Sub 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     RunProcess() 
    End Sub 
End Class 

Обратите внимание на Async ключевое слово в объявлении RunProcess подразделам и Await ключевого слова.

Вы запускаете WaitForExit в другом потоке и с помощью Await приложение в основном останавливается на этой линии, пока задача завершается.
Это, однако, также сохраняет ваш GUI в то же время. Для примера я просто показываю прогрессную панель (она невидима раньше) и скрыть ее, как только задача будет завершена.

Это также исключает любые Application.DoEvents hocus pocus.

+0

Отличное объяснение, и оно соответствует счету. Я изменил его, чтобы отключить кнопки во время работы и снова включить, когда закончите. ** Супер простой! Благодарим вас за отличный и быстрый ответ! ** – Phylum

+0

Добро пожаловать, Юлий. – Jens

Смежные вопросы