0
私はjoystick.hの基本的な機能を包むRuby拡張を使って、Ruby on Linuxでいくつかのジョイスティックプログラミングをしています。ジョイスティックイベントを取得することは、デフォルトではブロックされた読み込みですが、私はそれがゲームループを中断することを望んでいません。Blocking Readのスレッディング
現在、私はジョイスティックに非ブロッキング呼び出しを行い、それを非常に速いループで実行することで、ハッキングしています。それは動作しますが、ジョイスティックのイベントを可能な限りリアルタイムに近づけたいので、スクリプトは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上でのジョイスティックの動作を誤解していますか?それとももっと良いアプローチになっていますか?
joystick.eventはネイティブ拡張ですか? [Global Interpreter Lock(GIL)](http://www.igvita.com/2008/11/13/concurrency-is-a-myth-in-ruby/)に遭遇している可能性があります。 – dbenhur
ネイティブではありません。しかし、このメソッドは単にCの 'read'関数への呼び出しをラップします。これはブロックしているものです。以前は他のブロック呼び出しを回避するためにスレッドを使って成功していたので、GILが問題であるかどうかはわかりません。 – Max
さらなる調査:私はそれがGILかもしれないと思います。私はrb_thread_blocking_regionを利用する必要があります – Max