2017-10-03 13 views
0

bash 또는 gnuplot과 같은 명령 줄 프로그램 용 GUI 인터페이스 프로그램을 쓰고 있는데, 지금은 tlmgr이라고합니다. 메인 쓰레드가 GUI (scalafx) 꼬 않는 다른 스레드 tlmgr 시작과 연결 표준 입력/표준 출력/열려진 :스칼라 : ProcessIO 독자가 보조 프로그램의 출력을 느슨하게합니다.

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

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

errorFnProcessIO 패스 InputStream 인으로부터 BufferedReader를 사용

outputFn는 기본적으로 루프 출력에 읽고 SyncVar[String]로두고 않습니다

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

(좀 더 자세한 내용은 물론).

메인 스레드에서 tlmgr으로 문자열을 보내고 프롬프트가 다시 나타날 때까지 출력을 읽습니다.

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

(물론 조금 더 자세한 내용은 물론입니다).

이제는 문제없이 작동하며 여러 가지 방법으로 상호 작용할 수 있습니다. 많은 작업이 원활하게 처리됩니다.

다음이 발생할 때까지 : tlmgr에 특정 문자열을 보낸 다음 tlmgr을 내부적으로 수행합니다 (이것은 펄 프로그램 임). 그런 다음 tlmgr은 다시 외부 프로그램을 호출하여 작업을 수행합니다. 이 tlmgr이 행복하게 PROMPT을 다시 출력하면 BUT이 표시되며 이제는 독자가 볼 수 있습니다. 그것은 완전히 벗어난 것으로 보인다.

또한 tlmgr과의 통신이 엉망이고 아무런 반응이없고 모든 것이 중단됩니다.

이 설정에는 어떤주의 사항이 있습니까?

전체 코드 : 나는 문제를 발견하기 때문에 https://github.com/TeX-Live/tlcockpit

답변

0

난 내 자신의 질문에 대답하고있다. 코드의 일부가 보조 스레드에서 던져지고 예외적으로 발생했습니다. 흥미롭게도이 코드는 어디에서나 신호로 전달되지 않았습니다. 전체 스레드 부분에서 try 및 catch를 추가하면 버그가 발견되었습니다.

아직 잡히지 않은 예외로 프로그램이 계속 작동하는 것에 놀랐습니다.