我对标准外卖有异议。我正在生成一个Altera QuartusII进程,它使用其内置的tcl解释器执行一个Tcl脚本,然后退出。
当我从Windows上的命令提示符和/或Linux上的bash运行该进程时,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;发布于 2014-04-10 05:24:13
多亏了@Harald。
这确实是由于我使用的合并信道模式以及Quartus默认将其所有消息放在STDERR上的方式。由于Qt进行合并的方式,STDOUT出现在STDERR之后的缓冲区中。
修复方法是要么不使用合并的通道,要么在stderr上发布消息:
puts stderr "Synthesizing"
flush stderrhttps://stackoverflow.com/questions/22951983
复制相似问题