0

我有一个用于数学控制台程序 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——stdoutstderr产生提示。疯狂:如果我只是通过 cmd 在单独的 Windows 控制台中启动 Pari/GP,那么提示就在那里 - 好像有一个新管道,它不为createconsoleprocessWindows 操作系统所知,但提示是通过这个新的管道。

对这些版本唯一可能相关且可见的修改似乎是,旧版本具有cygwin.dllPari/GP 和新版本没有。但是,尽管我之前已经下载了一些文档,但我不知道 cygwin-secrets - 但这根本不是我的专业知识......

这是显示通信原理的图像。我们看到我的 GUI 的窗口,它有一个 Pari/GP 子进程,它通过 CreateConsoleProcess 过程提供的 STDIN/STDOUT 管道在后台与之通信。 图片

我还有一个精确的调试工具,可以准确地显示管道上的字符串流。只是在较新的版本中,提示字符串不再附加在 STDOUT 消息的末尾,(我也无法通过 STDERR 通信找到它)但是简单的 cmd 控制台窗口这个提示,所以它必须在任何地方……

4

1 回答 1

0

看来,问题不是与某些已知的 cygwin 不兼容等相关的问题之一,因此 stackoverflow 可能不是问这个问题的最佳场所,所以我在这里关闭此案例。


搜索结果:在查看了 Pari/GP 版本的 c 源之后,在我看来,我找到了原因。除了通过stdout之外,我找不到write()(或环绕它) ,因此他们可能为提示引入了另一种/一种新型管道的想法似乎是无效的。

尽管我不熟悉 c 语言,但在我看来,在将结果放入输出通道的关键例程中有代码,用于在发送之前从输出字符串中删除先前添加的提示字符串。有一些标志和if s 和else s 围绕它,所以它们可能更早地确定程序是由 dos/windows-console 启动(然后离开提示字符串)还是由其他进程启动(然后删除提示字符串)- 有一个名为isinteractive的标志,其中包括在该源代码段中切换。

因此,缺少 cygwin.dll 的影响问题可能与这个特定问题无关 - 除了就是未设置标志的原因......

我将尝试联系软件作者以获得具体帮助。

于 2016-02-10T19:03:03.777 回答