我在stdout排序方面遇到问题。我正在生成一个Altera QuartusII进程,该进程使用其内置的tcl解释器执行tcl脚本,然后退出。
当我在Windows和/或Linux上从命令提示符运行进程时,stdout顺序如下:
Synthesizing
... lots of quartus_map and quartus_cdb messages ...
Fitting
... lots of quartus_fit messages ...
然而,当我使用Qt的QProcess生成进程,并在进程完成时读取完整的stdout缓冲区时,顺序如下:
... lots of quartus_map and quartus_cdb messages ...
... lots of quartus_fit messages ...
Synthesizing
Fitting
我运行的tcl脚本看起来像这样:
puts stdout "Synthesizing"
flush stdout
if { [ catch {qexec "quartus_map $proj -c $rev" } ] } {
post_message -type error "Error: quartus_map failed: ${::errorInfo}"
exit
}
if { [ catch {qexec "quartus_cdb $proj -c $rev --merge" } ] } {
post_message -type error "Error: quartus_cdb failed: ${::errorInfo}"
exit
}
puts stdout "Fitting"
flush stdout
if { [ catch {qexec "quartus_fit $proj -c $rev" } ] } {
post_message -type error "Error: quartus_fit failed: ${::errorInfo}"
exit
}
我不知道为什么顺序不同。对于如何使用QIODevice获得正确排序的任何帮助或想法,我们将不胜感激。stdout上的所有消息都可用,stderr上没有预期的消息。
编辑:它可以通过这个简单的代码复制:
QProcess* process = new QProcess;
QStringList args;
args << "-t";
args << "test.tcl";
process->setWorkingDirectory("D:/work/fpga_designs/my_design");
process->start("C:/tools/Altera/Quartus/13.0/quartus/bin/quartus_sh", args, QProcess::ReadWrite);
if (!process->waitForStarted(30000)) {
process->waitForFinished();
return 1;
}
while (process->state() == QProcess::Running || process->state() == QProcess::Starting) {
QCoreApplication::processEvents();
}
process->setReadChannelMode(QProcess::MergedChannels);
QByteArray ba_stdout = process->readAllStandardOutput();
qDebug() << ba_stdout;
由于@Harald修复了它。
这确实是由于我使用的合并通道模式,以及Quartus默认情况下将所有消息放在STDERR上的方式。由于Qt进行合并的方式,STDOUT出现在缓冲区中的STDERR之后。
修复方法是要么不使用合并的通道,要么在stderr:上发布消息
puts stderr "Synthesizing"
flush stderr