当 qprocess 完成时监控 运行 qprocess 和 return 值
Monitor running qprocess and return value when qprocess is finished
我想 运行 一个 qprocess(程序 adb),当该过程完成时 return 将结果发送给调用函数。但是,adb 很有可能会发现自己处于循环中,将 "ADB server didn't ACK" 之类的错误消息打印到标准输出,而永远不会完成。我需要捕获这些错误。
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);
}
如果我启用 signal/slot,dolog() 将标准输出打印到日志文件,但 RunProcess return 是一个空字符串。如果我禁用 signal/slot,RunProcess() return 会按预期输出 qprocess。
首先,您需要确定有问题的命令使用哪个输出流来处理错误。
它非常像 stderr
,因此您需要连接到 readyReadStandardError()
信号。
对于命令本身,我建议将其拆分为命令和参数,并使用带有命令和参数列表的 QProcess::start()
重载。
只是比依靠再次正确分隔的单个字符串更可靠。
我想 运行 一个 qprocess(程序 adb),当该过程完成时 return 将结果发送给调用函数。但是,adb 很有可能会发现自己处于循环中,将 "ADB server didn't ACK" 之类的错误消息打印到标准输出,而永远不会完成。我需要捕获这些错误。
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);
}
如果我启用 signal/slot,dolog() 将标准输出打印到日志文件,但 RunProcess return 是一个空字符串。如果我禁用 signal/slot,RunProcess() return 会按预期输出 qprocess。
首先,您需要确定有问题的命令使用哪个输出流来处理错误。
它非常像 stderr
,因此您需要连接到 readyReadStandardError()
信号。
对于命令本身,我建议将其拆分为命令和参数,并使用带有命令和参数列表的 QProcess::start()
重载。
只是比依靠再次正确分隔的单个字符串更可靠。