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