2010-12-18 2 views
10

사용자가 키를 누를 때 루프를 빠져 나가고 싶습니다.Clojure에서 키 누름을 기다리는 방법

C에서는 kbhit()를 사용합니다. 거기에 Clojure (또는 Java)가 있습니까?

+1

어떤 종류의 응용 프로그램을 사용하십니까? 콘솔, 스윙, 서블릿? – ffriend

+0

콘솔 REPL에서 swank 또는 기타를 사용합니다. – justinhj

+1

새 스레드 ('agent','future','Thread' 또는 무엇을 사용하든)를 시작하십시오. 실제 처리를 수행하고, 스레드 변수를 저장하고,'main'에서 입력을 읽으며, 비어 있지 않으면 전용 스레드를 중지하십시오 . REPL로 방금 놀면, [this] (http://www.objectcommando.com/blog/2010/06/10/clojure-futures/)가 귀하의 요구 사항을 완전히 커버합니다. – ffriend

답변

2

Java의 (Linux?) 콘솔에서 키 누르기를 비 차단 방식으로 처리하려고합니다. earlier question은이를 가능하게 할 두 개의 Java 라이브러리를 제안했습니다. 이식 할 필요가 없다면, 해결책은 here입니다. 기본적으로

,

public class Foo { 
    public static void main(String[] args) throws Exception { 
    while(System.in.available() == 0) { 
     System.out.println("foo"); 
     Thread.sleep(1000); 
    } 
    } 
} 

작동하지만 콘솔의 InputStream 버퍼링되고 그 OS에 의해 결정되기 때문에, 오직 '수익'을 누른 후 (리눅스). 즉, 채널이나 다른 NIO 클래스를 사용하면이를 극복 할 수 없습니다. 콘솔이 각각의 모든 문자를 플러시하는지 확인하려면 터미널 설정을 수정해야합니다. 한 번 C 프로그램을 작성했는데 (현재 터미널의 termios 구조체의 ICANON 플래그를 수정), Java에서 그 방법을 모르지만 (the second link 참조)

일반적으로 'java nonblocking input'에 대해 searching 개를 추가로 찾을 수 있습니다.