2016-10-25 18 views
0

qprocess(プログラムadb)を実行したいとき、プロセスが終了したら結果を呼び出し関数に返します。しかし、adbがループ内で見つかる可能性はありますが、「ADBサーバーはACKではありませんでした」などのエラーメッセージを標準出力に出力します。私はこれらのエラーをトラップする必要があります。qプロセスが実行されているときのモニタと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); 

     } 

Iは、ログファイルに標準出力信号/スロット、dolog()印刷を有効にするが、RunProcessは空文字列を返す場合。信号/スロットを無効にすると、RunProcess()はqprocess出力を期待通りに返します。

+5

'processEvents()'は存在しません。それが間違って使用されている時間の99%は、ここに当てはまります。一度でも呼び出さない、数十万行の完全に良いアプリケーションを書くことができます。プロセスを実行してその出力を取得する場合は、プロセスの関連する信号に1つ以上のスロットを接続する必要があります。また、 'readAllStandardOutput'を使用するのではなく、' while(run_command.canReadLine()){auto line = run_command.readLine(); ...} ' –

答えて

0

まず、問題のコマンドがエラーのために使用している出力ストリームを特定する必要があります。 stderrと非常によく似ているので、代わりにreadyReadStandardError()信号に接続する必要があります。

コマンド自体については、コマンドと引数に分割し、コマンドと引数のリストを取るQProcess::start()オーバーロードを使用することをお勧めします。 もう一度正しく分離された単一の文字列に頼るよりも堅牢です。

関連する問題