Вопрос

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

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

Класс пользовательского интерфейса:

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

Creaded CETED_SOCKET CLASS:

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 или более сообщения, поэтому, когда оно выполняет сообщение = sock.recv (1024) снова, в сообщении переменной будет объединено несколько сообщений. Я подумал о включении длины сообщения в каждое сообщение, поэтому, если в 1024 байтах будет представлено более 1 сообщения, он возьмет сообщение и поместит все остальное в переменную Message_buffer и перед тем, как сделать Sock.Recv (1024), он будет проверить, если бы проверил, если бы, если бы проверил, если бы, если бы проверил, если бы, если бы проверил бы, если бы, если бы проверит, если бы, если бы проверит, если бы, если бы проверит, если бы, если бы проверит, если бы, если Переменная Message_buffer содержит что -нибудь, и если да, поместите сообщение Message_buffer в переменную сообщения вместо sock.recv (1024). Есть ли более простое/лучшее решение для этого?

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

Нолхиан

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top