インスタントメッセージングプログラムを作成しようとしていますが、基本的なUIはほぼ完成しており、メッセージの受信部分を調べています。UIクラスとスレッド化されたReceive_Socketクラスがあります。Received_Socketクラスのソケットは、メッセージを受信するたびに、gobject.idle_add()を実行してUIメソッドを呼び出し、メッセージをチャットウィンドウに表示します。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
スレッド化された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)この種のコードは効率的ですか?それは(私のUIクラスと一緒にスレッド化された受信クラスを持つ)続行するための最良の方法ですか?
2)メッセージが表示されるまでに、ソケットは2つ以上のメッセージを受信している可能性があるため、message = sock.recv(1024)を再度実行すると、複数のメッセージが可変メッセージに連結されます。各メッセージにメッセージの長さを含めることを考えたので、1024バイトに複数のメッセージがある場合はメッセージを受け取り、残りをmessage_buffer変数に入れ、sock.recv(1024)を再度実行する前にチェックします。 message_buffer変数には何かが含まれている場合は、sock.recv(1024)の代わりにmessage_bufferをメッセージ変数に入れます。これを行うためのより簡単でより良い解決策はありますか?
前もって感謝します、
ノルヒアン