[#4479] Requesting addition to IRB (configurable standard output) — Sascha Ebach <se@...>

Hello,

13 messages 2005/02/24
[#4482] Re: Requesting addition to IRB (configurable standard output) — Sam Roberts <sroberts@...> 2005/02/25

Quoting se@digitale-wertschoepfung.de, on Fri, Feb 25, 2005 at 01:22:34AM +0900:

[#4483] Re: Requesting addition to IRB (configurable standard output) — Eric Hodel <drbrain@...7.net> 2005/02/25

On 24 Feb 2005, at 19:51, Sam Roberts wrote:

[#4488] Re: Requesting addition to IRB (configurable standard output) — Sam Roberts <sroberts@...> 2005/02/26

Quoting drbrain@segment7.net, on Sat, Feb 26, 2005 at 02:43:31AM +0900:

[#4489] Re: Requesting addition to IRB (configurable standard output) — Eric Hodel <drbrain@...7.net> 2005/02/26

On 25 Feb 2005, at 16:03, Sam Roberts wrote:

Re: [bug?] curses + threads = non-blocking getch

From: Tanaka Akira <akr@...17n.org>
Date: 2005-02-15 15:14:59 UTC
List: ruby-core #4435
In article <20050214231544.GE26414@masanjin.net>,
  William Morgan <wmorgan-ruby-core@masanjin.net> writes:

> Using the curses library, it looks like non-blocking getch (i.e. when
> Ncurses.nodelay = 1) will block when there are other Threads running.
> Once the other Thread dies, it resumes non-blocking operation, but only
> once a key is pressed. With the ncurses library, this problem doesn't
> happen.

It is not a non-blocking I/O.  It checks an available input before
reading.  It can be re-implemented as follows:

  require "curses"

  class Curses::Window
    def getch_nodelay
      if IO.select([STDIN], nil, nil, 0)
        getch
      else
        -1
      end
    end
  end

  begin
    Curses.init_screen
    Curses.noecho

    start = Time.now
    Thread.new { sleep 5; }

    while true
      Curses.stdscr.setpos(5, 5)
      Curses.stdscr.addstr("#{(Time.now - start).round} waiting for input...")
      Curses.refresh

      x = Curses.stdscr.getch_nodelay

      Curses.stdscr.setpos(5, 5)
      Curses.stdscr.addstr("#{(Time.now - start).round} got: #{x}             ")
      Curses.refresh

      sleep 0.5
    end
  ensure
    Curses.echo
    Curses.close_screen
  end
-- 
Tanaka Akira

In This Thread