首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STDOUT:使用QIODevice读取时bash中的顺序与顺序不同

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

Stack Overflow用户
提问于 2014-04-09 03:02:22
回答 1查看 203关注 0票数 2

我对标准外卖有异议。我正在生成一个Altera QuartusII进程,它使用其内置的tcl解释器执行一个Tcl脚本,然后退出。

当我从Windows上的命令提示符和/或Linux上的bash运行该进程时,stdout顺序如下所示:

代码语言:javascript
复制
Synthesizing
... lots of quartus_map and quartus_cdb messages ...
Fitting 
... lots of quartus_fit messages ...

但是,当我使用Qt的QProcess生成进程并在进程完成时读取完整的stdout缓冲区时,顺序如下所示:

代码语言:javascript
复制
... lots of quartus_map and quartus_cdb messages ...
... lots of quartus_fit messages ...
Synthesizing
Fitting 

我运行的tcl脚本如下所示:

代码语言:javascript
复制
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上没有预期的内容。

编辑:它可以通过以下简单代码来再现:

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-10 05:24:13

多亏了@Harald。

这确实是由于我使用的合并信道模式以及Quartus默认将其所有消息放在STDERR上的方式。由于Qt进行合并的方式,STDOUT出现在STDERR之后的缓冲区中。

修复方法是要么不使用合并的通道,要么在stderr上发布消息:

代码语言:javascript
复制
puts stderr "Synthesizing"
flush stderr
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22951983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档