2012-03-12 64 views
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上的工作方式?还是有一个完全不同的方式来处理这个更好?

+0

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

+0

这不是本地的。但是这种方法只是调用了C'read'函数 - 这就是阻塞。我不确定GIL是否是问题,因为我已经成功地使用线程来绕过其他阻塞呼叫。 – Max 2012-03-12 20:34:07

+0

进一步调查:我认为这可能是GIL。我需要使用rb_thread_blocking_region – Max 2012-03-12 21:57:58

回答

0

我需要在C扩展中使用rb_thread_blocking_region进行读取呼叫。现在完美的工作!