使用我的应用程序,我调用外部命令行工具,将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
答案 0 :(得分: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
的按钮/菜单。
答案 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