我有一个QProcess
,我从我的应用程序的后端获取数据。我有一个简单的连接来获得由QProcess
产生的输出string
。现在,如果我请求一个命令,它工作得很好。
现在,我需要一行一个接一个地运行两个命令。预期的行为如下:
-
发送命令1
-
等待命令1的输出
-
将命令1的输出存储在变量
中 -
发送命令2
-
等待命令2的输出
-
将命令2的输出存储在变量
中
但是我有一个意想不到的行为。这两个命令被发送到后端,但是sometimes
I从这两个输出中得到一个混合输出。我认为这可能与后端返回第一个结果所需的时间有关。我需要等待第一个输出来发送第二个命令。有什么办法解决这个问题吗?
如果使用study->waitForFinished();
或study->waitForFinished(-1);
,应用程序会冻结并崩溃。
这是我的代码:
connect(study, &QProcess::readyReadStandardOutput, [=] {
QString out = study->readAllStandardOutput();
qDebug()<< "Output= " << out;
}
void StudyClass::writeCommand(const QString& line) {
study->write(line.toLocal8Bit());
}
如果我写两个命令如下:
writeCommand("print_status;");
writeCommand("print_say_hello");
有时我得到所需的输出(在连接中调用的qDebug):
Output= 0
Output= hello world
但有时我只是得到一个混合的输出:
Output= 0 hello world
这是错误的行为,因为我需要得到每个命令的结果,而不是只有一个。
为了为两个命令提供单独的输出,您必须等待第一个输出,然后才发送第二个命令。你似乎没有延迟地发送两个命令,所以偶尔你在一次调用信号处理程序中得到两个命令的输出。
如果我理解正确的话,您的QProcess是一个长时间运行的进程,通过stdin接收输入命令,然后您希望捕获这些命令中的每个命令的输出。如果是这种情况,那么在主线程上调用study->waitForFinished()
会阻塞,因为在每个命令之后进程仍在运行。
你可以试试waitForReadyRead()
或waitForBytesWritten()
。