2014-02-02 6 views
1

Я использую EventMachine.open_keyboard в моем клиенте приложение Irc, который использует rbcurse (Ncurses камень), следующим образом:Повторное использование оптоволоконной в Рубине

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

Этот код должен быть в волокне и поймать вход в неблокируемом образом. После того, как я попытаюсь ввести вторую строку, ruby ​​выбрасывает исключение «мертвого волокна». Я пробовал добавлять циклы, но это блокирует также, и изменение волокна в поток не работает с клавиатурным модулем. Другие способы, с помощью которых я пытался заблокировать все мои потоки, один из которых отвечает за сохранение/обновление буфера. Как я могу изменить код, чтобы сохранить Fiber открытым/живым после ввода первой строки? Чтобы просмотреть модуль клавиатуры (сам не писал), перейдите here.

Edit: Благодаря ответу Савва я понял это:

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

ответ

0

Добавить

loop{Fiber.yield} 

в конце тела волокна.

+0

Спасибо за ваш ответ, и это несколько помогло, приложение не разбилось, и я могу набрать столько строк, сколько хочу, но они не добавлены в буфер. Как это исправить? – user3261959