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)?
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)?
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".
Jakiego rodzaju aplikacji używasz? Konsola, Swing, serwlety? – ffriend
Tylko z konsoli REPL używając swank lub w inny sposób. – justinhj
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