VB.NET从其他应用程序获取实时状态
在我的应用程序中,我调用一个外部命令行工具,将iso转换为其他文件格式。现在我只调用iso转换器,它将在后台运行,当您通过命令行运行iso转换器时,您可以看到它在做什么,但在我的应用程序中,它只是在后台运行 现在它只给我在文本框中完成等时转换后的状态,我怎样才能更改它以便我可以看到实时状态?就像我在命令行工具中看到的那样 这是我正在调用的代码,用于执行isoconverterVB.NET从其他应用程序获取实时状态,.net,vb.net,.net,Vb.net,在我的应用程序中,我调用一个外部命令行工具,将iso转换为其他文件格式。现在我只调用iso转换器,它将在后台运行,当您通过命令行运行iso转换器时,您可以看到它在做什么,但在我的应用程序中,它只是在后台运行 现在它只给我在文本框中完成等时转换后的状态,我怎样才能更改它以便我可以看到实时状态?就像我在命令行工具中看到的那样 这是我正在调用的代码,用于执行isoconverter Private Sub GETCMD3() Dim CMDprocess As New Process
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
我不确定,可能是访问进程线程并检查状态 大概是这样的:
CMDprocess.Threads(0).ThreadState = ThreadState.Running
当前代码的问题在于行
txtIsoOutput.Text = SR.ReadToEnd
这是读取命令的标准输出流,直到完成为止。完成后,它会将结果指定给文本框
相反,您需要使用StreamReader.ReadLine
或ReadBlock
一次读取一点StreamReader
比如:
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
不过,这可能还不够好。用户界面线程现在正忙于处理命令输出,因此文本框没有机会更新其显示。解决此问题的最简单方法是在修改文本后添加Application.DoEvents()
。但是,请确保在GETCMD3
启动时禁用调用GETCMD3
的任何按钮/菜单。[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。找到了这个链接,但我不知道如何在我的代码中实现它。@PandaNL——这个链接是用于VB6的(你可以看到,如果你点击“应用于”),它是一种与VB.NET完全不同的语言。对不起。我想我误解了这个问题。我的答案是检查进程是否仍然处于活动状态并正在运行。经过一些测试后,它确实将cpu推到了70%,80%。如何使用application.doevents解决这个问题?您可以在循环中添加对System.Threading.Thread.Sleep(100)
的调用,每次等待100毫秒(0.1秒)。然后,这将每秒读取流10次,并在大部分时间释放CPU。如果不需要这么快的更新速度,可以增加睡眠时间以减少CPU使用。