进程读数标准输出

QProcess reading standard out

本文关键字:标准输出 进程      更新时间:2023-10-16

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

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

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

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

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