0

私は、数学コンソール プログラム Pari/GP 用のユーザー GUI (Delphi 6、32 ビット) を持っています。私は、目に見えないサブプロセス ウィンドウで Pari/GP を呼び出し、パイプ STDIN と STDOUT を使用して通信します。コンソールサブプロセスの Delphi のソースコードから、STDERR も認識できます。

Pari/GP バージョン 2.2.11 からバージョン 2.4 程度まではすべて正常に動作し、プロンプトを待ってサブプロセスとの通信 (非同期) の開始と終了を決定しました。しかし、バージョン 2.5 以降、パイプはプロンプトを表示しなくなりました。ただし、cmd-window で Pari/GP を起動すると、プロンプトを含む完全なダイアログが表示されます。(私はWin7、64ビットを持っていますが、これは関係がないようです.XP、32ビットの仮想マシンでも動作は同じです)

私は Pari/GP ソフトウェアのソース コードを持っていませんが、バージョン間の重要な違いの 1 つは、新しいバージョンには外部の cygwin.dll が含まれていないことです。

Q: その動作は既に知られていますか? また、その理由は? 既知の回避策はありますか? また、役に立った可能性が最も高い理由を示します。


リクエストに応じて、もう少し背景を説明します。Delphi-6 では、プロシージャ「createconsoleprocess」(Jedi-project によって実装) を使用します。これはwriteln(<string>)、目に見えないサブプロセスと、パイプを介した応答を非同期で待機する 2 つのわずかに異なる永続スレッド (と仮定します) に を提供しstdoutます。それはすべてのバージョンで問題なく機能します。
しかし、古いバージョンでは、各応答で Pari/GP が使用されていpromptました (Dos ウィンドウの Dos プロンプトのような一部の文字のみ)。回答の最後の部分に追加されたので、prompt-symbol が発生するまで応答の一部を解析し、その完全な回答を文字列リストを介して Pari/GP 出力としてユーザーに表示できました。

バージョン Pari/GP 2.5 の後、そのプロンプトは表示されなくなりました。そのため、修正を行わないと、ユーザーは Pari/GP 応答の完了を無限に待ちます。プロンプトとエコーのソフトウェアフラグを変更しても、パイプ定義でハックワイズに置き換えstdoutても、プロンプトを生成することはできませんでした。stderrクレイジー: cmd を介して別の Windows コンソールで Pari/GP を起動するcreateconsoleprocessと、プロンプトが表示されます。あたかも Windows OS には認識されていないが Windows OS には認識されている新しいパイプが存在し、プロンプトがこの新しいパイプを介して送信されるかのようです。パイプ。

バージョンに関連する唯一の目に見える変更は、古いバージョンにはcygwin.dllPari/GP があり、新しいバージョンにはそれがないことです。しかし、以前に少しドキュメントをダウンロードしたにもかかわらず、cygwin-secretsについてはわかりません-しかし、それは単に私の専門知識ではありません...

これは、通信の原理を示す画像です。GUI のウィンドウが表示され、CreateConsoleProcess プロシージャによって提供される STDIN/STDOUT パイプを介してバックグラウンドで通信する Pari/GP サブプロセスがあります。 画像

パイプ上の文字列の流れを正確に表示する正確なデバッグ ツールもあります。単に新しいバージョンでは、STDOUT メッセージの最後にプロンプ​​ト文字列が追加されなくなりました (また、STDERR 通信経由で見つけることもできません) が、単純な cmd-console ウィンドウにはこのプロンプトがあるため、どこにでもある必要があります。 ....

4

1 に答える 1