2012-03-12 34 views
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上でのジョイスティックの動作を誤解していますか?それとももっと良いアプローチになっていますか?

+0

joystick.eventはネイティブ拡張ですか? [Global Interpreter Lock(GIL)](http://www.igvita.com/2008/11/13/concurrency-is-a-myth-in-ruby/)に遭遇している可能性があります。 – dbenhur

+0

ネイティブではありません。しかし、このメソッドは単にCの 'read'関数への呼び出しをラップします。これはブロックしているものです。以前は他のブロック呼び出しを回避するためにスレッドを使って成功していたので、GILが問題であるかどうかはわかりません。 – Max

+0

さらなる調査:私はそれがGILかもしれないと思います。私はrb_thread_blocking_regionを利用する必要があります – Max

答えて

0

rb_thread_blocking_regionを使用してCエクステンションで読み込みを行う必要がありました。今すぐ完璧に動作します!