如何避免使用QProcess->readAllStandardOutput()获得混合输出?



我有一个QProcess,我从我的应用程序的后端获取数据。我有一个简单的连接来获得由QProcess产生的输出string。现在,如果我请求一个命令,它工作得很好。

现在,我需要一行一个接一个地运行两个命令。预期的行为如下:

  • 发送命令1

  • 等待命令1的输出

  • 将命令1的输出存储在变量

  • 发送命令2

  • 等待命令2的输出

  • 将命令2的输出存储在变量

但是我有一个意想不到的行为。这两个命令被发送到后端,但是sometimesI从这两个输出中得到一个混合输出。我认为这可能与后端返回第一个结果所需的时间有关。我需要等待第一个输出来发送第二个命令。有什么办法解决这个问题吗?

如果使用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()

最新更新