【发布时间】:2012-03-12 05:46:36
【问题描述】:
我正在使用 Ruby 扩展在 Linux 上进行一些操纵杆编程,该扩展包含了 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 上的工作方式?还是有更好的解决方法?
【问题讨论】:
-
joystick.event 是原生扩展吗?您可能会遇到Global Interpreter Lock (GIL)。
-
它不是原生的。但是该方法只是包装了对 C
read函数的调用——这是阻塞的。我不确定 GIL 是否是问题所在,因为我之前曾成功使用线程绕过其他阻塞调用。 -
进一步调查:我认为可能是 GIL。我需要使用 rb_thread_blocking_region
-
您可能想结帐Rubygame::Joystick。我没有使用它,但他们有一个事件队列,并且是 2.6 版本。我打赌他们已经解决了阻塞问题。 :)
标签: ruby linux multithreading joystick