如果时时读取进程,且不中止进程运行,还有没有办法

泡面的幸福 2018-01-24 09:36:10
output 是string类型,Process进程运行的是cmd /c ping 127.0.0.1-t 无限ping

output = Process.StandardOutput.ReadToEnd() '读取进程的输出,
这个进程一直在运行,我如何过一断时间就能取读值,不中断进程运行
...全文
558 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
清晨曦月 元老 2018-01-28
  • 打赏
  • 举报
回复
在远古时代用的是readfile,writefile,flushconsoleinputbuffer之类的,在.net中可以用重定义输入输出流的相关方法。这里有一个若干年前写的小品,用来调用一些象棋子类的AI的,如果你要做无限循环Ping,那需要自己扩展一下终止方法。
Imports System.IO
Imports System.Threading
Public Class ReIntOutStream
    Private myProcess As Process                '子进程
    Private myThread As Thread                  '循环线程
    Private myStreamWriter As StreamWriter      '子进程写入流
    Private myStreamRead As StreamReader        '子进程读取流
    Event ReadLine(ByVal Info As String)        '读到一行数据
    ''' <summary>
    ''' 创建子进程并重定向其输入、输出流以供程序处理
    ''' </summary>
    ''' <param name="ExePath">子进程所在目录(支持转义符),应以"\"结束;当进程位于系统环境变量所指示的目录时,可将此值设置为String.Empty。</param>
    ''' <param name="ExeName">子程序文件名</param>
    ''' <param name="CreateNoWindow">是否使用无窗口模式</param>
    ''' <param name="WorkingDirectory">是否设置子进程工作目录为ExePath参数所指定的目录,设置此目录可解决某些程序使用工作目录下文件的问题</param>
    ''' <remarks>要接收子进程返回的内容应处理PipeReadLine事件</remarks>
    Sub New(ByVal ExePath As String, ByVal ExeName As String, Optional ByVal CreateNoWindow As Boolean = True, Optional ByVal WorkingDirectory As Boolean = True)
        '定义子进程并设置其参数
        myProcess = New Process()                           '创建一个进程
        myProcess.StartInfo.FileName = ExePath & ExeName    '要启动的程序,如果文件位于系统Path内,则第一个参数可设置为String.Empty
        myProcess.StartInfo.CreateNoWindow = CreateNoWindow '创建无窗口模式,这要比创建隐藏窗口的代码运行起来更稳定
        If WorkingDirectory Then                            '对于某些程序,它直接调用自身工作目录下的文件,如果不设置该值(为String.Empty)将出现错误
            myProcess.StartInfo.WorkingDirectory = ExePath
        End If
        '允许重定义子进程输入输出流
        myProcess.StartInfo.UseShellExecute = False         '是否启动外壳程序,只有当不启动时,才可以重定向输入、输出、错误流
        myProcess.StartInfo.RedirectStandardInput = True    '允许重定向输入流
        myProcess.StartInfo.RedirectStandardOutput = True   '允许重定向输出流
        myProcess.Start()                                   '启动该进程
        '重定义输入输出流
        myStreamWriter = myProcess.StandardInput            '重定义输入流,以用我们的写入流向其该进程输入内容
        myStreamRead = myProcess.StandardOutput             '重定义输出流,以用我们的读取流获得该进程输出内容
        '启动新线程实现读取信息
        myThread = New Thread(AddressOf ReadInfo)           '为方便处理子进程返回的信息,循环读取以引发事件的方式来处理
        myThread.Start()
    End Sub
    ''' <summary>运行指定的命令</summary>
    ''' <param name="cmd">命令内容</param>
    ''' <remarks>命令内容无需以回车、换行或回车换行符结束</remarks>
    Public Sub SendCommand(ByVal cmd As String)
        myStreamWriter.WriteLine(cmd)                       '向写入流写入命令(无需加入回车、换行等即可自动执行),以使子进程执行
    End Sub
    '用一个循环读取子进程返回的内容并引发PipeReadLine事件以将其传递给调用者
    Private Sub ReadInfo()
        Do Until myProcess.HasExited                        '循环读取直到子进程退出时终止线程
            Try                                             '由于这个流不支持Peek方法,所以只能测试读回值是不是Nothing
                Dim Info As String = myStreamRead.ReadLine()
                If Info IsNot Nothing Then RaiseEvent ReadLine(Info)
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
        Loop
    End Sub

End Class
调用PING命令的话,可以这样用: Dim WithEvents p As New ReIntOutStream(String.Empty, "cmd") p.SendCommand("Ping www.163.com -t") Private Sub p_PipeReadLine(ByVal Info As String) Handles p.ReadLine debug.pring(Info) End Sub
loveganjiqi 2018-01-25
  • 打赏
  • 举报
回复
我是 China
loveganjiqi 2018-01-24
  • 打赏
  • 举报
回复
Shell("cmd.exe /c ping 127.0.0.1。。。。。, vbNormalFocus)

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧