Socket Thread и PyGTK

Я пытаюсь написать программу обмена мгновенными сообщениями, базовый ui почти закончен, и я просматриваю принимающую часть сообщений. У меня есть UI-класс и потоковый класс Receive_Socket. Каждый раз, когда сокет класса Received_Socket получает сообщение, он вызывает gobject.idle_add () для вызова метода пользовательского интерфейса, чтобы отобразить сообщение в окне чата. После строки gobject.idle.add () у меня есть цикл while, цикл которого показывается на самом деле в окне чата (я хочу, чтобы сообщение отображалось перед получением другого сообщения, потому что я читал, что gobject.idle_add () не гарантирует исполнение заказа, и, конечно, я хочу, чтобы сообщения отображались в порядке :))

Я попытался подвести свой код:

UI Класс:

Class UI: ##### somewhere in the init ##### self.message_status = 0 def chat_window(self, contact, message=0): Check if a chat window is opened for the contact, if not it opens one. => In reality this check if a gtk.Window containing a gtk.Notebook is opened, => if not it opens one => Then it creates a page for the contact in the notebook, containing a => gtk.Textview which displays messages if message: self.message_display(contact, message) def message_display(self,a,b): => Display the message in the message in the contact's textview self.message_status = 1 

Threaded Receive_Socket класс:

 Class Receive_Socket(threading.thread): message = sock.recv(1024) => the sender name is written in the message if message: gobject.idle_add(myui.chat_window,sender, message) while not myui.message_status: time.sleep(0.1) myui.message_status = 0 

Основной код:

 if __name__ == "__main__": myui = UI() reception = Receive_Socket() reception.start() gtk.main() 

Мои вопросы :

1) Является ли этот вид кода эффективным? Это (Имея многопоточный класс приема вместе с моим классом пользовательского интерфейса), лучший способ продолжить работу?

2) К моменту появления сообщения сокет может получать 2 или более сообщений, поэтому, когда сообщение message = sock.recv (1024) снова, в сообщении переменной будет объединено несколько сообщений. Я думал о включении длины сообщения в каждом сообщении, поэтому, если в 1024 байтах содержится более 1 сообщения, это займет сообщение, а остальные останутся в переменной message_buffer, и, прежде чем снова выполнить sock.recv (1024), он проверит, переменная message_buffer содержит что угодно, и если это так, поместите message_buffer в переменную сообщения вместо sock.recv (1024). Есть ли более легкое / лучшее решение для этого?

Заранее спасибо,

Nolhian

One Solution collect form web for “Socket Thread и PyGTK”

  1. Нет. Не используйте нити. Вместо этого используйте glib.io_add_watch чтобы заставить gtk / glib сам вызвать вашу функцию, когда сокет готов к чтению. Таким образом, вы не будете замораживать свой gui и не будете нуждаться в потоках. Вам также не понадобится idle_add .

  2. Если вы делаете 1 , у вас не будет этой проблемы, так как сообщения будут поступать по порядку, и не будет одновременных потоков, чтобы запутать данные.

  • Python и GTK +: как создать объекты для сбора мусора?
  • Gtk.StatusIcon PopupMenu в python
  • urllib2 открыватель зависает, если он запускается внутри потока
  • GtkTreeView с несколькими столбцами и GtkListStore с одним настраиваемым типом (в Python)
  • import gtk не работает на mac
  • Как щелкнуть по gtk.Window?
  • Серьезная нестабильность с pygtk 2.22 и python 2.6
  • Можно ли нарисовать GtkTreeView, как GtkIconView?
  • Python - лучший язык программирования в мире.