3

インスタントメッセージングプログラムを作成しようとしていますが、基本的な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をメッセージ変数に入れます。これを行うためのより簡単でより良い解決策はありますか?

前もって感謝します、

ノルヒアン

4

1 に答える 1

3
  1. いいえ。スレッドは使用しないでください。代わりにglib.io_add_watch、ソケットが読み取る準備ができたときに、gtk/glib自体が関数を呼び出すようにするために使用します。そうすれば、GUIがフリーズしたり、スレッドが不要になったりすることはありません。また、必要はありませんidle_add

  2. 1を実行すると、メッセージが順番に到着し、データを混乱させる同時スレッドが発生しないため、この問題は発生しません。

于 2010-12-15T20:09:36.923 に答える