Ruby, Curses, Threading, and Sleeping

I’m attempting to get a curses application running in a threaded
environment to handle input with no delay. This is needed for
portability reasons. I have found though that in a threaded ruby
environment that whenever there is a call to sleep (even in a
different thread) then Curses behaves differently. The following code
acts as I expect it to:

require ‘curses’
require ‘pp’

ch = []

Curses::stdscr.nodelay = true

t = do
x = 0

while c = Curses::stdscr.getch
break if c == 9 #tab exits
sleep 0.1
Curses::addstr(" ")
ch << [c]

pp ch

It works just fine and grabs input with out waiting for it and returns
an error value when there is no input. If you change the line ‘x = 0’
to ‘sleep 1’ then the behavior of Curses changes and the line c =
Curses::stdscr.getch will now sit idle until a key has been pressed.

Is there a better way of making threads idle other than sleep that
won’t cause this side effect? Is there a better way of grabbing input
that the way that I am using?

My stats:
Emachines M6805 (running in 32bit)
Ubuntu 6.10
Ruby 1.8.4

Barry Dmytro
[email protected]

badcherry [email protected] wrote:

I’m attempting to get a curses application running in a threaded

curses isn’t thread-safe.

Well yeah, I realize that, but anyone have any suggestions for making
this work? It runs just fine on *nix systems done a different way,
but will then not run in windows do to how ruby threads behave in
windows. I want this to run on both platforms.