Rosca de soquete e PyGTK
Estou tentando escrever um programa de mensagens instantâneas, a interface do usuário básica está quase concluída e estou analisando a parte de recebimento das mensagens. Eu tenho uma classe de interface do usuário e uma classe Receive_Socket encadeada. Cada vez que o soquete da classe Received_Socket recebe uma mensagem, ele executa um gobject.idle_add () para chamar um método de interface do usuário para exibir a mensagem em uma janela de bate-papo. Após a linha gobject.idle.add (), eu tenho um loop while que faz um loop até que a mensagem seja realmente exibida na janela de bate-papo (eu quero que a mensagem seja exibida antes de receber outra mensagem porque li esse gobject.idle_add () não garante a ordem de execução e, é claro, quero que as mensagens sejam exibidas em ordem :))
Eu tentei resumir meu código:
Classe da interface do usuário:
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
Classe Receive_Socket encadeada:
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
Código principal:
if __name__ == "__main__":
myui = UI()
reception = Receive_Socket()
reception.start()
gtk.main()
Minhas perguntas :
1) Esse tipo de código parece eficiente? É (ter uma classe de recebimento encadeada junto com minha classe de interface do usuário) a melhor maneira de prosseguir?
2) Quando a mensagem é exibida, o soquete pode ter recebido 2 ou mais mensagens; portanto, quando receber message = sock.recv (1024) novamente, várias mensagens serão concatenadas na variável. Pensei em incluir o tamanho da mensagem em cada mensagem, portanto, se houver mais de uma mensagem nos 1024 bytes, ela receberá a mensagem e colocará o restante em uma variável message_buffer e antes de executar o sock.recv (1024) novamente, verificará se a variável message_buffer contém qualquer coisa e, se estiver, coloque o message_buffer na variável message em vez de sock.recv (1024). Existe uma solução mais fácil / melhor para fazer isso?
Desde já, obrigado,
Nolhian