Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.NET从其他应用程序获取实时状态_.net_Vb.net - Fatal编程技术网

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

VB.NET从其他应用程序获取实时状态,.net,vb.net,.net,Vb.net,在我的应用程序中,我调用一个外部命令行工具,将iso转换为其他文件格式。现在我只调用iso转换器,它将在后台运行,当您通过命令行运行iso转换器时,您可以看到它在做什么,但在我的应用程序中,它只是在后台运行 现在它只给我在文本框中完成等时转换后的状态,我怎样才能更改它以便我可以看到实时状态?就像我在命令行工具中看到的那样 这是我正在调用的代码,用于执行isoconverter Private Sub GETCMD3() Dim CMDprocess As New Process

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

现在它只给我在文本框中完成等时转换后的状态,我怎样才能更改它以便我可以看到实时状态?就像我在命令行工具中看到的那样

这是我正在调用的代码,用于执行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

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

大概是这样的:

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使用。