Ruby + Curses:Ctrl + c的非阻塞getch()+陷阱?

时间:2014-09-30 11:54:33

标签: ruby curses

我想在Ruby中使用Curses:

  1. getch()无法阻止/暂停该计划。
  2. q时,退出程序立即
  3. Ctrl-C的陷阱,以避免中断。
  4. 但是,我只能做到第一点:

    1. q时,它会在退出前等待一段时间(<1秒)。
    2. 似乎Curses使Ctrl-C陷阱根本不起作用......
    3. # -*- coding: utf-8 -*-
      require "curses"
      
      Curses.init_screen
      Curses.noecho()
      Curses.curs_set(0)              #invisible cursor
      Curses.timeout = 0
      Curses.addstr("Press [q] to abort")
      sec=0
      while true
      
        # if place this outside the while loop, q key will be unable to work
        # at all...
        if Curses.getch == 'q'
          Curses.close_screen         #seems unnecessary
          exit
        end
      
        sec += 1
        hello = "Hello World #{sec}"
        Curses.setpos(Curses.lines / 2, Curses.cols / 2 - (hello.length / 2))
        Curses.addstr(hello)
        Curses.refresh
        sleep 1
      end
      
      # Avoid C-c interruption, but Curses seems to ignore it.
      Signal.trap(:INT){
        return nil
      }
      

1 个答案:

答案 0 :(得分:1)

  

按q时,它会在退出前等待一段时间(<1秒)。

您应该将无响应的睡眠与阻止输入结合起来:
设置timeout = 1000并移除sleep 1

如果这不是您想要的,那么您需要多线程。

  

Ctrl-C的陷阱,以避免中断。

您可以使用Curses.raw()切换到原始模式,所有输入都将直接转移给您,而无需自动处理Ctrl + C等。