2012-03-12 2 views
0

저는 조이스틱의 기본 기능을 감싸는 Ruby 확장을 사용하여 Linux에서 루비의 조이스틱 프로그래밍을하고 있습니다. 조이스틱 이벤트를 얻는 것은 기본적으로 차단 읽기이지만 게임 루프를 방해하지 않기를 바랍니다.블로킹 리드 스레딩

현재 조이스틱을 비 블로킹 (non-blocking)으로 호출하고이를 매우 빠른 루프에서 실행함으로써 해킹하고 있습니다. 그게 효과가 있지만, 가능한 한 실시간에 가까운 조이스틱 이벤트를 원하기 때문에 스크립트는 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 호출 블록 메인 스레드 같은 것을 할 노력하고있어. 루비 스레드의 작동 방식이나 조이스틱이 리눅스에서 어떻게 작동하는지 완전히 오해하고 있습니까? 아니면 이것에 접근하는 완전히 다른 방법이 있습니까?

+0

joystick.event는 기본 확장 기능입니까? [Global Interpreter Lock (GIL)] ​​(http://www.igvita.com/2008/11/13/concurrency-is-a-myth-in-ruby/)이 발생할 가능성이 있습니다. – dbenhur

+0

네이티브가 아닙니다. 그러나이 메소드는 C 함수를 호출하는 것을 막아 버린다. 이전에 다른 블로킹 호출을 처리하기 위해 스레드를 사용하여 성공했기 때문에 GIL이 문제인지 확실하지 않습니다. – Max

+0

추가 조사 : 나는 그것이 GIL일지도 모른다라고 생각한다. rb_thread_blocking_region을 사용해야합니다. – Max

답변

0

rb_thread_blocking_region을 사용하여 C 확장 프로그램에서 읽기 호출을해야했습니다. 완벽하게 작동합니다!