【问题标题】:QProcess reading standard outQProcess 读取标准输出
【发布时间】:2014-07-08 17:11:09
【问题描述】:

我有两个 GUI 应用程序,其中一个使用 QProcess 运行另一个。第二个应用程序做了一些工作并将结果字符串写入标准输出。第一个应用程序正在等待从 QProcess 发出的readyReadStandardOutput 信号。问题是在第二个应用程序运行时我没有收到这个信号 - 我必须关闭它才能获得结果字符串。我用一个简单的控制台应用程序尝试了同样的事情,一切都很好。有人可以帮忙吗?

【问题讨论】:

  • 您是作为 W32 还是控制台应用程序运行第二个应用程序?根据我的经验,cin/cout 不能很好地处理非控制台应用程序。 This question 那么你可能会感兴趣。
  • 是的,我正在运行 win32 应用程序。但正如@hyde 所说,问题出在标准输出缓冲中。

标签: c++ qt qprocess


【解决方案1】:

问题可能是标准输出缓冲。由于您显然可以修改控制台应用程序,请尝试添加 std::flush,类似

std::cout << "FUBAR" << std::flush;

您也可以尝试在控制台应用程序中使用std::setvbuf 来禁用所有缓冲或强制行缓冲,但如果您有明确的地方可以在其中刷新所有输出,我可能更喜欢显式刷新一次。

发生这种情况是因为 stdout 的缓冲方式不同,具体取决于它是在实际终端/控制台中运行(更具体地说,有 tty/pty)还是输出到管道。使用终端,人们可能正在实时查看输出,而行缓冲是实时和吞吐量之间的一个不错的折衷。使用管道,输出将发送到另一个进程,它通常不关心什么时候刷新,所以默认是仅在缓冲区已满时才刷新以最小化 IO 开销,如果没有足够的输出,甚至可以在进程退出时填充缓冲区。

【讨论】:

  • 再次感谢您提供如此详细的解释!