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() //阻塞,直到外部程序結束
  如果在主線程中調用這些函數,可能會造成當前用戶界面不響應。

 


  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM