2010-02-22 6 views
1

저는 파이 게임을 사용하여 게임을 프로그래밍하고 있습니다. 실시간 통신을위한 UDP 기반 프로토콜 인 OpenSoundControl (OSC)을 사용하여 문자 중 하나를 제어하려고합니다. 기본적으로 나는 simpleOSC 모듈을 사용하여 내 파이 게임 프로그램의 일부 OSC 명령에 기능을 부여합니다.파이 게임 및 스레딩 : 전역에 액세스 할 때 잠겨 있습니까?

globalsomething = {} 

def handler(*m): 
    global globalsomething 
    print "it works" 
    print globalsomething 
    print "not working" 

if __name__ == "__main__": 
    osc.init() 
    osc.listen('', 3333) 
    osc.bind(handler,'/game/dosmtng') 
    app = Game() 
    while True: 
     app.MainLoop() 

게임 pygame.init을 (실행) 및 무 거의 모든 관련 수행하는 간단한 클래스입니다 :

내 게임의 구조는 다음과 같이 (당신이 아이디어를 얻을 수 있도록이가 단순화)입니다 파이 게임으로

코드를 실행할 때 문제는 osc 패킷을 보낼 때 "작동하지만"작동하지 않고 "이후 osc 패킷이 처리되지 않는다는 것입니다.

simpleOSC는 스레드를 사용하기 때문에이 동작에 대한 유일한 설명은 pygame이 일종의 호환되지 않는 스레딩 (?)을 사용하고 pygame의 스레드에있는 변수에 액세스하려고 할 때 잠금을 설정한다는 것입니다.

원인과 해결책 (가능한 경우)에 대한 아이디어가 있으십니까?

+0

현재이 솔루션을 사용 중입니다. 비 차단 소켓을 사용하고 스레드 사용을 중단하기 위해 simpleOSC 코드를 해킹했습니다. 이것은 추한 솔루션이지만 작동합니다. 그러나 나는 더 깨끗한 것을 찾고 싶다. –

답변

3

실제로 스레드/동시성 문제가 있는지 여부를 확인할 수는 없지만 가능성은 있습니다. 나는 그것을 해결할 수있는 해결책을 제안 할 수있다.

파이썬 다중 처리 모듈은 대기열이있는 새 프로세스 (스레드 아님)를 생성하는 방법을 보여줍니다. 새 프로세스를 만든 다음 OSC를 초기화하고 핸들러에서 무엇인가가 도착할 때마다 큐에 메시지를 저장하게하면 주 파이 게임 프로세스에서 대기열을 폴링하여 들어온 메시지를 가져올 수 있습니다.

마음에 드는 것보다 조금 덜 깨끗하지만 적어도 팔 길이에서 두 개의 모듈을 얻을 수 있으므로 서로 간섭 할 수 없습니다.

+0

좋은 생각 같아요! 나는 멀티 프로세싱 모듈에 대해 몰랐다! 다중 처리를 사용할 수 있다고 생각합니까? 다중 처리를 사용하는 대신 데이터를 공유하는 값. Queue? –

+0

Process + Queue 옵션을 구현했으며 완벽하게 작동합니다! 감사! –