2010-12-18 20 views
10

Chciałbym wyjść z pętli, gdy użytkownik naciśnie klawisz.Jak czekać na naciśnięcie klawisza w Clojure

W języku C używam kbhit(). Czy istnieje odpowiednik Clojure (lub Java)?

+1

Jakiego rodzaju aplikacji używasz? Konsola, Swing, serwlety? – ffriend

+0

Tylko z konsoli REPL używając swank lub w inny sposób. – justinhj

+1

Rozpocznij nowy wątek ('agent',' future', 'Thread' lub cokolwiek użyjesz), który wykona rzeczywiste przetwarzanie, zapisz zmienną wątku, z' main' odczyta dane wejściowe, a gdy nie jest pusta, zatrzymaj dedykowany wątek . Jeśli grasz tylko w REPL, [this] (http://www.objectcommando.com/blog/2010/06/10/clojure-futures/) całkowicie pokryje twoje potrzeby. – ffriend

Odpowiedz

2

Szukasz bezblokowej obsługi naciśnięcia klawisza w konsoli (Linux?) W Javie. An earlier question zasugerował dwie biblioteki Java, które mogą to włączyć. Jeśli nie musi być przenośny, istnieje rozwiązanie here.

Zasadniczo

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

prace, ale (w systemie Linux) tylko po naciśnięciu przycisku „powrót”, ponieważ InputStream konsola jest buforowane i która jest określana przez system operacyjny. Oznacza to, że nie możesz tego uniknąć, używając kanałów lub dowolnej innej klasy NIO. Aby upewnić się, że konsola opróżnia każdy znak, musisz zmodyfikować ustawienia terminala. Kiedyś napisałem program w języku C, który to robi (modyfikuję flagę ICANON terminala w bieżącym terminalu), ale nie wiem jak to zrobić z Javy (ale zobacz the second link).

Ogólnie można znaleźć więcej w tym numerze przez searching dla "java nonblocking input".

Powiązane problemy