0

この Python スケルトンがあります。main.py は問題なく、server.py は問題ありません。しかし、chat() が起動された瞬間gtk.main()に GUI が表示されますが、実行された瞬間には、server.py モジュールまたは chat.py 自体でのアクティビティは許可されません。

他のクラスを中断してマルチタスクのようにすべて実行しないように、chat.py を柔軟にするにはどうすればよいですか?

注: os.system('/var/tmp/chat.py') server.py から実行すると問題はありませんが、問題はその方法で通信できないことです (その方法を回避しようとしています)。

chat.py が終了するまでアプリケーション全体をブロックすることなく、chat.py を独立して動作させることができる理由と方法はありますか?

main.py:

#!/usr/bin/python
from myglobal import bgcolors
from myglobal import parsePresets
from server import server
from chat import chat
t = server(58888)
t.start()

サーバー.py

class server(threading.Thread):
  def __init__(self, port):
    threading.Thread.__init__(self)
    self.port = port
    self.selfv = chat()
    self.selfv.run()

  def run(self):
    host = ''
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind((host, self.port))
    #s.setblocking(0) # non-blocking
    s.listen(1)
    conn, addr = s.accept()
    serverFlag = True
    while serverFlag:
      try:
        data = conn.recv(1024)
      except socket.error:
        s.listen(1)
        conn, addr = s.accept()
        continue

      if not data:
        s.listen(1)
        conn, addr = s.accept()
      else:
        line = data
        conn.send('ok')
        conn.close()

チャット.py

class chat(object):

  def listener(self, sock, *args):
    conn, addr = sock.accept()
    gobject.io_add_watch(conn, gobject.IO_IN, self.handler)
    return True

  def handler(self, conn, *args):
    line = conn.recv(4096)
    if not len(line):
      return False
    else:
      return True

  def __init__(self):
    self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    self.window.set_size_request(800, 450)
    self.window.move(0,0)
    self.window.set_name("main window")
    self.window.connect("delete-event", gtk.main_quit)
    self.drawingarea = gtk.DrawingArea()
    self.window.add(self.drawingarea)

  def run(self):
    self.sock = socket.socket()
    self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.sock.bind(('', 58881))
    self.sock.listen(1)
    gobject.io_add_watch(self.sock, gobject.IO_IN, self.listener)
    self.window.show_all()
    self.window.set_keep_above(True)
    if(self.window.get_window().get_state() == gtk.gdk.WINDOW_STATE_MAXIMIZED):
      self.window.unmaximize()
    gtk.main()

  def quit(self):
    gtk.main_quit()


#if __name__=='__main__':
#    s=SelfView()
#    s.run()
    #gobject.MainLoop.run()
4

2 に答える 2

0

常にメイン スレッドで gui を実行します。GUI を開始する前に別のスレッドでサーバーを開始します。GUI が終了したら、リスナーを閉じます。

于 2013-09-22T09:31:05.133 に答える
0

あなたのコードをテストするにはあまりにも多くのことが欠けているので、私の答えはあまり自信がありません.

オブジェクトのコンストラクターはserverオブジェクトのrunメソッドを呼び出しchat、それが を呼び出しますgtk.main()。これにより、GTK のイベント ループの実行が開始されるため、ユーザーが GUI を閉じるまで、このスレッドでは何も起こりません。実際、startサーバー スレッドのメソッドが実行される可能性はありません。

gtk.main()別のスレッドで実行したいと思います。これを行う方法を提案するには、あなたがやろうとしていることについてもっと情報が必要です. chatオブジェクトを のインスタンスにする必要があるかもしれませthreading.Threadん。

于 2013-09-22T09:24:17.523 に答える