2016-10-25 94 views
0

我想運行一個QProcess中(程序ADB),當過程結束後結果返回給調用函數。但是,adb可能會發現自己處於循環狀態,並將諸如「ADB服務器未確認」之類的錯誤消息打印到標準輸出,而不是完成。我需要捕捉這些錯誤。監控運行QProcess中和返回值時QProcess中完成

QProcess run_command; 
    connect(&run_command,SIGNAL(readyReadStandardOutput()),this,SLOT(dolog()));  
    QString result=RunProcess("adb connect 192.168.1.100"); 

    ... 

    QString MainWindow::RunProcess(QString cstring) 
    { 

    run_command.start(cstring); 

     // keep gui active for lengthy processes.      

     while(run_command.state() != QProcess::NotRunning) 
      qApp->processEvents(); 

     QString command=run_command.readAll(); 
     return command; // returns nothing if slot is enabled. 
    } 

    void MainWindow::dolog() 
     { 
      QString logstring = run_command.readAllStandardOutput(); 
       if (logstring.contains("error condition") 
       logfile("Logfile:"+logstring); 

     } 

如果啓用標準輸出到一個日誌文件信號/槽,dolog()打印,但RunProcess返回空字符串。如果我禁用信號/插槽,RunProcess()將按照預期返回qprocess輸出。

+5

忘記'processEvents()'存在。 99%的時間使用錯了,這就是這種情況。你可以編寫完美的應用程序,數十萬行,甚至一次都不會調用它。如果你想運行一個進程並得到它的輸出,你應該爲進程的相關信號附加一個或多個插槽。您也不想使用'readAllStandardOutput',但是通過執行'while(run_command.canReadLine()){auto line = run_command.readLine(); '' –

回答

0

首先,你需要確定哪些輸出流有問題的命令使用其錯誤。 這非常類似於stderr,因此您需要連接到readyReadStandardError()信號。

對於命令本身,我建議把它分成命令和參數,並使用QProcess::start()重載需要的命令和參數列表。 僅僅依靠一個單獨的字符串被再次正確地分開就更加強大。