Дисплей pyopengl заблокирован при одновременной работе в качестве сервера сокетов - PullRequest
0 голосов
/ 20 декабря 2010

Я на самом деле использую программу pyopengl для работы в качестве сервера сокетов.В то же время сервер получает команды от клиентов, интерпретирует эти команды и одновременно выполняет соответствующее рисование.

В случае, если основной поток блокировался при выполнении операций с сокетом, я фактически запускал поток для выполнения сокетасервер принимает вещь, и метод сокета сервера обновлений вызывается в цикле отображения.

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. , когда клиент записан в другомPython-файл начал выдвигать данные, цикл отображения завис, как если бы он был мертв

1 Ответ

0 голосов
/ 28 декабря 2010

В getClientContent линия self.clientbuffer.readline(); выполняет блокирующий вызов для сокета, и это почти наверняка вызывает вашу проблему.

Вместо этого вам нужно сделать так, чтобы метод run выполнял операции readline и вставлял данные в очередь, из которой затем графический поток считывает данные.

...