0
我正在Ruby上使用Ruby擴展包裝joystick.h的基本功能的Ruby擴展在一些遊戲杆編程。獲取遊戲杆事件默認爲阻塞讀取,但我不希望中斷遊戲循環。線程圍繞阻塞閱讀
目前我正在通過對遊戲杆進行非阻塞調用並以非常快的速度運行該遊戲塊來解決這個問題。這是有效的,但它也使腳本使用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 2012-03-12 16:01:44
這不是本地的。但是這種方法只是調用了C'read'函數 - 這就是阻塞。我不確定GIL是否是問題,因爲我已經成功地使用線程來繞過其他阻塞呼叫。 – Max 2012-03-12 20:34:07
進一步調查:我認爲這可能是GIL。我需要使用rb_thread_blocking_region – Max 2012-03-12 21:57:58