2014-09-30 87 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等。