[#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:

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

From: William Morgan <wmorgan-ruby-core@...>
Date: 2005-02-14 23:16:06 UTC
List: ruby-core #4432
Hello experts,

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.

I'm not a curses/ncurses expert, so maybe I'm doing something wrong.
Here's the code:

  require "curses"

  begin
    Curses.init_screen
    Curses.noecho
    Curses.stdscr.nodelay = 1

    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

      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

You'll see that getch blocks ("waiting for input" is displayed) until
after the first five seconds, when the thread dies. Then as soon as you
press a key, getch is back in non-blocking mode. If you remove the
Thread.new call, everything works as it should.

This is on ruby 1.8.2 (2005-01-10) [i386-linux].

For reference, here's the equivalent Ncurses code, which works fine:

  require "ncurses"

  begin
    Ncurses.initscr
    Ncurses.noecho
    Ncurses.stdscr.nodelay true

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

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

      x = Ncurses.stdscr.getch

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

      sleep 0.5
    end
  ensure
    Ncurses.endwin
  end

Is this a bug, or am I doing something wrong?

Thanks,

-- 
William <wmorgan-ruby-core@masanjin.net>

In This Thread

Prev Next