0

我有这个 Python 框架,其中 main.py 很好,server.py 很好。但是在 chat() 启动的那一刻,我看到了 GUI,但是在gtk.main()执行的那一刻,它不允许 server.py 模块下的任何活动,也不允许在 chat.py 本身中进行任何活动。

我怎样才能让 chat.py 变得灵活,这样它就不会干扰其他类并像多任务一样运行?

注意: os.system('/var/tmp/chat.py') 当我从 server.py 执行时我没有问题,但我的问题是我无法以这种方式进行通信(所以尽量避免使用这种方法)

任何想法,为什么以及如何使 chat.py 独立工作而不会导致我的整个应用程序被阻止直到 chat.py 退出?

主要.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

我遗漏了太多东西来测试你的代码,所以我的回答不会很有信心。

对象的构造server函数调用对象的run方法,该方法chat又调用gtk.main(). 这将开始运行 GTK 的事件循环,因此在用户关闭 GUI 之前,该线程中不会发生任何事情。实际上,start您的服务器线程的方法没有被执行的机会。

我想你想gtk.main()在不同的线程上运行。为了建议如何做到这一点,恐怕我需要更多关于你想要做什么的信息。也许您也需要使您的chat对象成为 的实例threading.Thread

于 2013-09-22T09:24:17.523 回答
0

始终在主线程中运行 gui。在 gui 启动之前在另一个线程中启动服务器。gui 退出后关闭监听器。

于 2013-09-22T09:31:05.133 回答