【问题标题】:How to wait for a key press in Clojure如何在 Clojure 中等待按键
【发布时间】:2010-12-18 18:30:52
【问题描述】:

我想在用户按键时跳出循环。

在 C 中我会使用 kbhit()。是否有 Clojure(或 Java)等价物?

【问题讨论】:

  • 您使用什么样的应用程序?控制台、Swing、servlet?
  • 使用 swank 或其他方式从控制台 REPL。
  • 启动新线程(agentfutureThread 或任何你使用的),它将进行实际处理,保存线程变量,从main 读取输入,以及何时不为空,停止你的专用线程。如果您只是玩 REPL,this 将完全满足您的需求。
  • 其实这就是我现在所做的,但我想最好的解决方案是使用 Swing 库来等待一个密钥并将其包装在我自己的 kbhit() 函数中
  • 好像用Swing库我需要做一个框架。我想知道是否有可能制作一个不可见的框架,其唯一目的是充当关键事件侦听器

标签: clojure kbhit


【解决方案1】:

您正在寻找 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);
    }
  }
}

有效,但(在 Linux 上)仅在按下“返回”后才有效,因为控制台输入流是缓冲的,这由操作系统决定。这意味着您无法通过使用 Channels 或任何其他 NIO 类来克服这一点。为确保控制台刷新每个字符,您需要修改终端设置。我曾经写过一个 C 程序来做到这一点(修改当前终端的 termios 结构的 ICANON 标志),但我不知道如何从 Java 中做到这一点(但请参阅the second link)。

一般来说,您可以在searching 的本期中找到更多关于“java 非阻塞输入”的内容。

【讨论】:

    猜你喜欢
    • 2012-11-02
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2018-10-30
    • 1970-01-01
    • 2016-06-07
    相关资源
    最近更新 更多