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

xdyibdwo  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(210)

我有一个QProcess,从应用程序的后端获取数据。我有一个简单的连接来获取QProcess生成的输出string。现在,如果我请求一个命令,它就可以正常工作。
现在,我需要依次运行一行中的两个命令。预期行为如下:

  • 发送命令1
  • 等待命令1的输出
  • 将命令1的输出存储在变量中
  • 发送命令2
  • 等待命令2的输出
  • 将命令2的输出存储在变量中

但是我有一个意外的行为。这两个命令被发送到后端,但是sometimes我从两个输出中得到了一个混合的输出。我想这可能与后端返回第一个结果所花费的时间有关。我需要等待第一个输出发送第二个命令。有什么办法来解决这个问题吗?
如果使用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

这是错误的行为,因为我需要获取每个命令的结果,而不是一个命令。

myzjeezk

myzjeezk1#

为了让两个命令有不同的输出,你必须等待第一个命令的输出,然后才发送第二个命令,你似乎没有延迟地发送两个命令,所以偶尔你会在一次调用信号处理程序时得到两个命令的输出。

iih3973s

iih3973s2#

如果我理解正确的话,您的QProcess是一个长时间运行的进程,通过stdin接收输入命令,然后您希望捕获每个命令的输出。如果是这种情况,则在主线程上调用study->waitForFinished()会阻塞,因为在每个命令之后进程仍在运行。
您可以尝试使用waitForReadyRead()waitForBytesWritten()

相关问题