我正在为带有REPL的命令行程序编写GUI界面程序(类似于bash或gnuplot),从现在起称为tlmgr。主线程执行GUI (scalafx)操作,另一个线程启动tlmgr并连接stdin/stdout/stderr:
val procIO = new ProcessIO(inputFn(_), outputFn(_), errorFn(_))
val processBuilder: ProcessBuilder = Seq("tlmgr", "shell")
process = processBuilder.run(procIO)outputFn和errorFn使用从InputStream传递到ProcessIO的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,但现在读者看到了它。它似乎完全迷失了方向。
此外,与tlmgr的进一步沟通似乎陷入困境,没有任何反应,一切都悬着。
这个设置有什么要注意的吗?
发布于 2017-10-06 10:45:29
我自己回答问题是因为我发现了问题。在一个辅助线程中抛出一段代码和异常,有趣的是,这没有在任何地方发出信号,也没有任何中断。在整个线程部分添加“尝试和捕捉”显示了错误。
尽管如此,我仍然感到惊讶的是,这个项目会继续与这个未被提及的例外情况一起工作。
https://stackoverflow.com/questions/46538288
复制相似问题