Поток вокруг блокирующего чтения - PullRequest
0 голосов
/ 12 марта 2012

Я занимаюсь программированием джойстика в Ruby под Linux с использованием расширения Ruby, которое включает в себя базовые функциональные возможности joystick.h.Получение события джойстика по умолчанию является блокирующим чтением, но я не хочу, чтобы это прерывало игровой цикл.

В настоящее время я хакуюсь вокруг него, делая неблокирующие вызовы джойстика и выполняя его вдействительно быстрая петля.Это работает, но также заставляет скрипт использовать 100% CPU, потому что я хочу, чтобы события джойстика были как можно ближе к реальному времени.

Я пытаюсь сделать что-то вроде

input = Thread.new do
  while e = joystick.event
    @event = e
  end
end

main = Thread.new do
  while true
    sleep 0.1
    puts @event
  end
end

Но даже тогда вызов joystick.event блокирует основной поток.Я совершенно не понимаю, как работают потоки Ruby или как работают джойстики в Linux?Или есть совершенно другой подход к этому, который лучше?

1 Ответ

0 голосов
/ 13 марта 2012

Мне нужно было сделать вызов на чтение в расширении C, используя rb_thread_blocking_region.Отлично работает сейчас!

...