• Qt ------ QProcess,启动外部进程,进程间通信


    简介:

    可用于完成启动外部程序,并与之交互通信。

    启动一个进程的名字叫“program”,如果某进程的路径没有设置成环境变量,“program”需要包含路径

    如果进程可以接收参数,参数叫“argument”

    把“program”和“argument”和在一起叫“command”

    部分方法说明:

    void QProcess::start(const QString &program, const QStringList &arguments, OpenMode mode = ReadWrite)

    会启动一个新的进程,如果某个 QProcess 对象已经启动了一个进程,此对象再次调用此方法会启动一个新进程,造成两个进程存在的情况(不推荐,第一个进程不受控制)

    void QProcess::start(const QString &command, OpenMode mode = ReadWrite)

    会启动一个新的进程

    void QProcess::start(OpenMode mode = ReadWrite)

    不会启动新进程,

    bool QProcess::waitForFinished(int msecs = 30000)

    等待进程结束,如果进程是 cmd.exe,可以在cmd的参数里面加“/c”,这样执行完一条指令,cmd.exe进程就退出了,但是如果没有在参数里面加"/c",默认等待30s,然后使用方法 readAllStandardOutput() 读出的也不是执行参数所返回的结果

    void QProcess::close()

    杀死进程

    QProcess详细介绍:

    一、启动外部程序的三种方式   

      1)一体式:void QProcess::start(const QString & program,const QStringList &arguments,OpenMode mode = ReadWrite)
        外部程序启动后,将随主程序的退出而退出。


      2)分离式:void QProcess::startDetached(const QString & program,const QStringList & arguments,const QString&workingDirectory=QString(),qint64 *pid =0)
        外部程序启动后,当主程序退出时并不退出,而是继续运行。


      3)分步设置

        设置路径
          void QProcess::setProgram(const QString & program)
        设置参数【可选】
          void QProcess::setArguments(const QStringList & arguments)
        启动
          选择启动函数(两种方式,start()或open())

    二、状态

      外部程序未启动时,其状态是NotRunning;
      当启动时,其状态转变为Starting,正在启动,但此时还未调用起来;
      启动之后,继续变为Running,同时发射出started()信号,此时,可以对QProcess进行读写操作了;
      当退出时,其状态改为NotRunning,并发射出finished()信号。finished()信号会携带退出码和退出状态,可以分别通过exitCode()和exitStatus()来获得。
      当发生错误时,QProcess会发出一个error()信号,同样的,也可以通过error()来获得其错误类型,通过state()获得当前程序的状态。

    三、QProcess与QIODevice

      QProcess继承与QIODevice,因此,我们可以把它当作一个I/O设备进行读写操作。

    四、交互

      QProcess有两种预定义的输入通道:标准输出stdout与标准错误stderr,它们本质上是两个独立的数据流,可以通过调用setReadChanned()函数设置当前的读通道,在进程启动以前以 MergedChannels 参数调用 setReadChannelMode() 函数可以把标准输出通道和标准输出错误通道合并。
      当通道的数据准备就绪时,QProcess会发出readyRead()信号。如果是标准输出,则发出readyReadStandardOutput()信号。如果是标准错误,则发出readyReadStandardError()信号。


      常用的读取方式有 read() ,readAll() 或 getChar(),也可以通过 readAllStandardOutput() 和 readAllStandardError() 读取标准输出和标准错误通道中的数据。
      某些程序需要设置环境才能进行特殊的操作。可以通过 setEnvironment() 来设置环境变量,通过 setWorkingDirectory() 来设置工作目录,默认的工作路径是当前调用程序的工作路径。

      Qt定义了如下的进程错误代码:
      错误常量 值 描述
      QProcess::FailedToStart 0 进程启动失败
      QProcess::Crashed 1 进程成功后崩溃
      QProcess::Timedout 2 最后一次调用waitFor...()函数超时。此时QProcess状态不变,并可以再次调用waitFor...()类型的函数
      QProcess::WriteError 3 向进程中写入数据时出错。如进程尚未启动,或者输入通道被关闭时。
      QProcee::ReadError 4 从进程中读取数据时出错。如进程尚未启动时
      QProcess::UnknownError 5 未知错误。这也是error()函数返回的默认值。

    五、同步API  

     QProcess提供了一系列的函数以提到事件循环来完成同步操作:
      1)waitForStarted()//阻塞,直到外部程序启动
      2)waitForReadyRead()//阻塞,直到输出通道中的新数据可读
      3) waitForBytesWritten()//阻塞,直到输入通道中的数据被写入
      4) waitForFinished() //阻塞,直到外部程序结束
      如果在主线程中调用这些函数,可能会造成当前用户界面不响应。


      

  • 相关阅读:
    199. 二叉树的右视图
    二叉树前、中、后、层次、遍历的非递归法
    奇思妙想
    917. 仅仅反转字母【双指针】
    JVM性能监控与故障处理工具
    Java线程池使用和常用参数(待续)
    MySQL常用知识
    手写常用算法
    LightOj 1170
    逆元总结
  • 原文地址:https://www.cnblogs.com/god-of-death/p/7802758.html
Copyright © 2020-2023  润新知