2014-09-30 123 views
0

我想在Ruby中使用诅咒:Ruby + Curses:非阻塞getch()+陷阱为Ctrl + c?

  1. getch()不能阻止/暂停程序。
  2. q时,立即退出程序
  3. Ctrl-C避免中断的陷阱。

然而,我刚完成可以在第一点:

  • 当按q,它会等待退出之前一段时间(< 1秒)。
  • 似乎Curses使陷阱Ctrl-C不工作...
  • # -*- 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

    当按下Q键,它会等待退出前一段时间(< 1秒)。

    你应该阻止输入结合反应迟钝睡眠:
    设置timeout = 1000和删除sleep 1

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

    Ctrl-C避免中断的陷阱。

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