我有一个用于数学控制台程序 Pari/GP 的用户 GUI(在 Delphi 6 中,32 位):我在一个不可见的子进程窗口中调用 Pari/GP 并使用管道 STDIN 和 STDOUT 进行通信,就我而言可以从 Delphi 中的源代码中识别控制台子进程,也可以是 STDERR。
从 Pari/GP 版本 2.2.11 到版本 2.4 左右,一切正常,我通过等待提示来确定与子进程的通信(异步)的开始和结束。但从 2.5 版开始,管道不再得到提示。但是,当我在 cmd 窗口中启动 Pari/GP 时,我会看到完整的对话框,包括提示。(我有 Win7,64 位,但这似乎不相关,在具有 XP 的虚拟机中的行为是相同的,32 位)
我没有 Pari/GP 软件的源代码,但版本之间可能存在显着差异,即较新的版本没有外部 cygwin.dll。
问:这种行为是已知的,也是它的原因吗?已知的解决方法?还暗示最可能的原因是有帮助的。
根据要求,更多背景知识。在 Delphi-6 中,我使用过程“createconsoleprocess”(由 Jedi-project 实现),它为
writeln(<string>)
不可见的子进程和两个稍微不同的永久线程提供了一个通过管道异步等待响应的永久线程(我假设,stdout
)。对于所有版本,这仍然可以正常工作。但在旧版本中,每个响应都是 Pari/GP
prompt
(只是一些字符,如 Dos 窗口中的 Dos 提示符)。附加到答案的最后一部分,这样我就可以解析响应的各个部分,直到prompt
-symbol 出现,然后可以通过字符串列表将完整的答案显示为 Pari/GP 输出给用户。
在版本 Pari/GP 2.5 之后不再出现该提示,因此如果我不进行更正,用户将无限等待 Pari/GP 响应的完成。对我来说,这是不可能的——无论是通过更改用于提示和回显的软件标志,还是通过管道定义中的 hackwise replace by——stdout
来stderr
产生提示。疯狂:如果我只是通过 cmd 在单独的 Windows 控制台中启动 Pari/GP,那么提示就在那里 - 好像有一个新管道,它不为createconsoleprocess
Windows 操作系统所知,但提示是通过这个新的管道。
对这些版本唯一可能相关且可见的修改似乎是,旧版本具有cygwin.dll
Pari/GP 和新版本没有。但是,尽管我之前已经下载了一些文档,但我不知道 cygwin-secrets - 但这根本不是我的专业知识......
这是显示通信原理的图像。我们看到我的 GUI 的窗口,它有一个 Pari/GP 子进程,它通过 CreateConsoleProcess 过程提供的 STDIN/STDOUT 管道在后台与之通信。
我还有一个精确的调试工具,可以准确地显示管道上的字符串流。只是在较新的版本中,提示字符串不再附加在 STDOUT 消息的末尾,(我也无法通过 STDERR 通信找到它)但是简单的 cmd 控制台窗口有这个提示,所以它必须在任何地方……