2010-12-20 2 views
0

실제로 pyopengl 프로그램을 사용하여 소켓 서버로 작동합니다. 동시에 서버는 클라이언트로부터 명령을 받고 이러한 명령을 해석하고 동시에 해당 도면을 수행합니다.pyopengl 디스플레이가 동시에 소켓 서버로 작동 할 때 차단되었습니다.

소켓 작업을 수행 할 때 주 스레드가 차단 된 경우 실제로 스레드 서버가 소켓 작업을 수행하기 시작했고 updateserver 소켓 메서드가 디스플레이 루프에서 호출됩니다. 이 죽은 것처럼 다른 파이썬 파일에 기록 클라이언트가 데이터를 밀어 시작하면

class SocketServer(Thread): 
def __init__ (self): 
    Thread.__init__(self) 
    self.serversocket = socket(AF_INET, SOCK_STREAM); 
    self.serversocket.bind(("127.0.0.1", 7780)); 
    self.status = -1;#not connected 
    self.clientsocket   = None; 
    self.clientaddress  = None; 
    self.clientbuffer   = None; 
    self.serversocket.listen(5); 
def run(self): 
    print 'thread running' 
    while(self.status == -1): 
     time.sleep(10); 
     (self.clientsocket, self.clientaddress) = self.serversocket.accept(); 
     self.clientbuffer = self.clientsocket.makefile('r',0); 
     self.status = 0; 
    #Thread.kill(); 
    #print 'SERVER LISTENNING FINISHED'; 

def getClientContent(self): 
    if (not self.clientbuffer): return "NONE CLIENT BUFFER"; 
    return self.clientbuffer.readline(); 

ss = SocketServer(); 

def updateServerSocket(): 
    global ss; 
    print ss.getClientContent(); 
  1. 내가 스레드
  2. 을 종료하는 방법을 모른다, 디스플레이 루프는 끊기를 가지고

답변

0

getClientContent에서 self.clientbuffer.readline(); 라인은 소켓에서 블로킹 콜을하고 있습니다. 이것이 거의 확실하게 문제를 일으키는 원인입니다.

대신 수행해야 할 작업은 readline을 수행하고 그래픽 표시 스레드가 읽는 대기열에 데이터를 저장하는 것입니다.