0

私は実際に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. 別のPythonファイルに書き込まれたクライアントがデータをプッシュし始めると、表示ループはまるで死んでいるかのようにハングアップしました
4

1 に答える 1

0

では getClientContent、回線self.clientbuffer.readline();がソケットでブロッキングコールを実行しており、それが問題の原因であることはほぼ間違いありません。

代わりに行う必要があるのは、runメソッドにreadlineを実行させ、データをキューに貼り付けて、グラフィカル表示スレッドがそこから読み取ることです。

于 2010-12-27T21:22:22.183 に答える