2013-04-02 5 views
0

파이 게임에서 실행되는 멀티 플레이어 게임이 있습니다. 별도의 스레드에서 게임/클라이언트/서버를 실행하고 간단한 에코 서버가 있습니다. 플레이어가 메시지를 브로드 캐스트 할 때마다 다른 모든 플레이어가 메시지를받습니다. 내가 겪고있는 문제는 파이 게임에 매 10 밀리 초마다 화면을 다시 그리는 while (true) 루프가 있다는 것입니다. 이 루프는 루프 밖에서는 아무 것도 할 수 없으므로 게임 월드가 업데이트되지 않게합니다. 나는 while 루프에서 대기열에서 큐를 제거하려고 시도했지만 명령을 처리 할 수는 있지만 작동하지 않는 것 같습니다 (q.put()은 대기열에 아무 것도 넣지 않습니다).파이 게임 다중 스레드

도움을 주셨습니다. 난 당신이주의 깊게 대기열 문서 http://docs.python.org/2/library/queue.html 및 스레딩 문서 http://docs.python.org/2/library/threading.html을 읽을 제안

class Client(Thread, Observer): 
    #waits for notifications from ClientSocket 
    #starts the game loop 
    #enqueue commands in the Game 

class ClientSocket(Thread, Observable): 
    #observes the socket and notifies the Client 

class Server(Thread): 
    #simply broadcasts commands to ClientSocket(s) 

class Game(Thread): 
    def __init__(self): 
     self.q = queue.Queue() 

    while True: 
     #delay 10 ms 
     #redraw 
     #see if u need to process queue 
+1

당신은 'CPython'이 진정으로 동시 적이 아니며'GIL' 권한으로 인해 한 번에 하나의 스레드 만 실행한다는 것을 알고 있습니까? –

+0

흠, 그래서 내가 시도 할 수있는 아이디어가 있습니까? 내 채팅은 완벽하게 작동하지만 파이 게임이 모든 것을 망가뜨리는 것 같습니다. – 1337holiday

+0

더 많은 코드를 게시하면 더 좋을 것입니다. Game 클래스에서 주 루프를 run() 메소드 안에 두시겠습니까? Client 클래스에서 game.start()를 사용하고 있습니까? – pmoleri

답변

-3

: 감사

여기

는 아키텍처의 조각입니다. while True:을 사용하기로 결정한 것이 좋지 않습니다. 잠금/세마포어/뮤텍스/이벤트에 대해 읽고이 간단한 예제를 확인하십시오 http://www.tutorialspoint.com/python/python_multithreading.htm 그리고 더 나은 멀티 스레딩 아키텍처를 만들 수 있다고 확신합니다.

+0

내 결정이 아니라 ... 파이 게임에는 화면에 아이템을 다시 그리기 위해 True가 필요합니다. 내 코드는 파이 게임과 결합되었을 때 올바르게 작동하지 않는다. 이벤트 중심 디자인을 사용해야 할 수도 있습니다 .... – 1337holiday