STDOUT:bash shell中的顺序与使用QIODevice读取时的顺序不同



我在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

相关内容

  • 没有找到相关文章

最新更新