VB.NET从其他应用程序获取实时状态

时间:2011-12-15 11:08:43

标签: .net vb.net

使用我的应用程序,我调用外部命令行工具,将iso转换为其他文件格式。现在我只是调用iso转换器,它将在后台运行,当你通过命令行运行iso转换器时,你会看到它在做什么,但在我的应用程序中它只是在后台运行。

现在它只给了我在文本框中完成isoconverter后的状态,我怎么能改变这个以便我可以看到现场状态?就像我在命令行工具中看到的那样?

这是我要求执行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

3 个答案:

答案 0 :(得分:2)

您当前代码的问题是

txtIsoOutput.Text = SR.ReadToEnd

这是读取命令的标准输出流,直到它完成。完成后,它会将结果分配给您的文本框。

您想要的是使用StreamReaderStreamReader.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的按钮/菜单。

答案 1 :(得分:1)

[Offtopic]我正在检查你的代码,也许我发现了你可以启动Isoconvert.exe的方法。

如果我没错,你可以使用startinfo启动Isoconvert.exe,而无需启动控制台命令。

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。

答案 2 :(得分:0)

我不确定,可能正在访问进程线程并检查状态?

这样的事情:

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