2017-10-03 5 views
0

bashまたはgnuplotのように、コマンドラインプログラム用のGUIインターフェイスプログラムをtlmgrと書いています。メインスレッドは、GUI(scalafx)ブツを行い、別のスレッドがtlmgrを開始し、標準入力/標準出力/標準エラー接続:Scala:ProcessIOリーダが補助プログラムの出力を緩める

val procIO = new ProcessIO(inputFn(_), outputFn(_), errorFn(_)) 
val processBuilder: ProcessBuilder = Seq("tlmgr", "shell") 
process = processBuilder.run(procIO) 

outputFn、そしてerrorFnProcessIOに渡す入力ストリームからBufferedReaderを使用:

val reader = new BufferedReader(new InputStreamReader(stdOut)) 

outputFnは、基本的にループして出力を読み取り、SyncVar[String]にそれを置くん

while (true) { 
    line = reader.readLine 
    outputString.put(line) 
} 

(もう少し詳しく)。

メインスレッドから、tlmgrに文字列を送信し、プロンプトが再び表示されるまで出力を読み取ります。

def get_output_till_prompt() = { 
    ... 
    while (!found) { 
    result = outputString.take() 
    if (result == "PROMPT") 
     found = true 

(もちろん、もう少し詳しく)。

これは問題なく動作し、さまざまなやり方で対話できます。多くのことが円滑に行われます。

tlmgrに特定の文字列を送信した後、tlmgrは内部的にいくつかのことを行います(それはperlプログラムです)。次にtlmgrが順番に外部プログラムを呼び出して何らかの作業を行います。このtlmgrの後にもう一度PROMPTを出力すると、BUTになりました。それは完全にオフに失われているようだ。

さらに、tlmgrとの通信はボトムになり、反応がなくなり、すべてがハングします。

この設定には警告がありますか?

全コード:https://github.com/TeX-Live/tlcockpit

答えて

0

私は問題を発見したので、私は自分の質問に答えますよ。興味深いことに、このコードはどこにでも通知されず、中断はありませんでした。スレッド部分全体にtryとcatchを追加するとバグが明らかになりました。

私はまだプログラムが未知の例外を処理し続けているのに驚いています。

関連する問題