Question

I use EventMachine.open_keyboard in my irc client app that uses rbcurse (ncurses gem), as follows:

Fiber.new do
    EM.open_keyboard(NbKeyboard) do |kb|
        $input = Readline.readline("")
        $buffer << $input
    end
end.resume

This code has to be in a Fiber and catch input in a nonblocking way. After I try to type a second line, ruby throws a "dead fiber" exception. I tried adding loops, but that blocks as well, and changing the fiber into a thread doesn't work with the keyboard module. Other ways I tried block all my threads, one of which is responsible for keeping the buffer updated/refreshed. How can I change the code to keep the Fiber open/alive after typing the first line? To view the keyboard module (didn't write it myself), go here.

Edit: Thanks to the answer of Sawa I figured it out:

Fiber.new do
    EM.open_keyboard(NbKeyboard) do |kb|
        loop do
            $input = Readline.readline("")
            $buffer << $input
            Fiber.yield
        end
    end
 end.resume
Was it helpful?

Solution

Add

loop{Fiber.yield}

at the end of the fiber body.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top