Я хочу запустить qprocess (программа adb) и по окончании процесса вернуть результаты вызывающей функции. Тем не менее, есть все возможности, что adb может оказаться в цикле, печатая сообщения об ошибках, такие как «ADB server not ACK», в stdout, даже не заканчивая. Мне нужно поймать эти ошибки.
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, как и ожидалось.
Сначала необходимо определить, какой выходной поток использует рассматриваемая команда для своих ошибок.
Это очень похоже stderr
так что вам нужно будет подключиться к readyReadStandardError()
сигнал вместо.
Для самой команды я бы рекомендовал разбить ее на команду и аргументы и использовать QProcess::start()
перегрузка, которая принимает команду и список аргументов.
Просто более надежно, чем полагаться на то, чтобы одна строка снова была правильно разделена.
Других решений пока нет …