2011-12-15 2 views
1

С моим приложением я вызываю инструмент внешней командной строки, который обращается к другим файлам. Прямо сейчас я просто вызываю iso-конвертер, и он будет работать в фоновом режиме, когда вы запустите изо-конвертер через командную строку, вы увидите, что он делает, но в моем приложении он просто работает в фоновом режиме.VB.NET Получение статуса live из другого приложения

Прямо сейчас он дает мне статус после того, как isoconverter сделан в текстовом поле, как я могу изменить это, чтобы я мог видеть статус в реальном времени? как я увижу в инструменте командной строки?

Это код, который я вызываю для выполнения изоконвертера.

Private Sub GETCMD3() 
    Dim CMDprocess As New Process 
    Dim StartInfo As New System.Diagnostics.ProcessStartInfo 
    StartInfo.FileName = "cmd" 
    StartInfo.CreateNoWindow = True 
    StartInfo.RedirectStandardInput = True 
    StartInfo.RedirectStandardOutput = True 
    StartInfo.UseShellExecute = False 
    CMDprocess.StartInfo = StartInfo 
    CMDprocess.Start() 
    Dim SR As System.IO.StreamReader = CMDprocess.StandardOutput 
    Dim SW As System.IO.StreamWriter = CMDprocess.StandardInput 
    SW.WriteLine("Isoconvert.exe " & txtIsoFile.Text) 
    SW.WriteLine("exit") 
    txtIsoOutput.Text = SR.ReadToEnd 
    SW.Close() 
    SR.Close() 
End Sub 

ответ

2

Проблемы с текущим кодом является линией

txtIsoOutput.Text = SR.ReadToEnd 

Это читает стандартный выходной поток команды до тех пор, пока не будет завершено. Как только он будет завершен, он присваивает результат вашему текстовому полю.

Вы хотите вместо этого читать с StreamReader немного за раз, используя StreamReader.ReadLine или, возможно, ReadBlock.

Что-то вроде:

Dim line as String 
Do 
    line = SR.ReadLine() 
    If Not (line Is Nothing) Then 
     txtIsoOutput.Text = txtIsoOutput.Text + line + Environment.NewLine 
    End If 
Loop Until line Is Nothing 

Это, вероятно, не будет достаточно хорошо, хотя. Поток пользовательского интерфейса теперь занят обработкой вывода команды, поэтому TextBox не получает возможности обновить его отображение. Самый простой способ исправить это - добавить Application.DoEvents() после изменения текста. Обязательно отключите любые кнопки/меню, которые вызывают GETCMD3, когда начинается GETCMD3.

+0

Он отлично работает, именно то, что я искал благодаря. – PandaNL

+0

После некоторого тестирования он действительно подталкивает процессор к 70%, 80%, как я могу решить эту проблему с помощью application.doevents? – PandaNL

+0

Вы можете добавить вызов 'System.Threading.Thread.Sleep (100)' внутри цикла, чтобы ждать 100 миллисекунд (0,1 секунды) каждый раз. Затем он будет считываться из потока 10 раз в секунду и освобождать процессор большую часть времени. Вы можете увеличить время сна, чтобы уменьшить использование ЦП, если вам не нужна такая быстрая скорость обновления. – Justin

0

Я не уверен, возможно, доступ к потокам процессов и проверка статуса?

Что-то вроде этого:

CMDprocess.Threads(0).ThreadState = ThreadState.Running 
+0

Как я могу использовать этот код? Извините, что я новичок в VB – PandaNL

+0

Нашел эту ссылку http://support.microsoft.com/kb/173085/, но я не знаю, как ее реализовать в моем коде. – PandaNL

+0

@PandaNL - эта ссылка предназначена для VB6 (вы можете видеть, нажимаете ли вы кнопку «Информация в данной статье»), что является совершенно другим языком VB.NET. – Justin

1

[Offtopic] Я просматривал ваш код, и, возможно, я нашел лучшее aproach в том, как вы можете запустить Isoconvert.exe.

Если я не ошибаюсь, вы можете запустить Isoconvert.exe, используя startinfo, без необходимости запуска консольной команды.

Dim CMDprocess As New Process 
Dim StartInfo As New System.Diagnostics.ProcessStartInfo 
StartInfo.FileName = "Isoconvert.exe" 
StartInfo.Arguments = txtIsoFile.Text 
CMDprocess.StartInfo = StartInfo 
CMDprocess.Start() 

Я думаю, вы все еще можете читать и писать stdin и stdout.

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