我有一个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
这是错误的行为,因为我需要获取每个命令的结果,而不是一个命令。
2条答案
按热度按时间myzjeezk1#
为了让两个命令有不同的输出,你必须等待第一个命令的输出,然后才发送第二个命令,你似乎没有延迟地发送两个命令,所以偶尔你会在一次调用信号处理程序时得到两个命令的输出。
iih3973s2#
如果我理解正确的话,您的QProcess是一个长时间运行的进程,通过stdin接收输入命令,然后您希望捕获每个命令的输出。如果是这种情况,则在主线程上调用
study->waitForFinished()
会阻塞,因为在每个命令之后进程仍在运行。您可以尝试使用
waitForReadyRead()
或waitForBytesWritten()
。