0

私のpythonスクリプトが開かれるとすぐに実行されるpygtkアプリケーションがあります。gtk.main() とともに、スクリプトの先頭で開始されるスレッドがあり、gtk.TextView() インスタンスを更新します。

def listen(self):
    while True:
        print "refreshing"
        data = self.socket.recv(buffer_size)
        if data:
            self.txtBuffer.insert(self.txtBuffer.get_end_iter(), data + "\n")
            print data

thread.start_new_thread(self.listen, ())
self.set_up_gui() # gtk.main()

ただし、プログラムを実行すると、GUI が開きますが、「更新」テキストは出力されず、ソケットに送信されたときにデータも出力されません。私は glib.add_idle() を使用してこのプログラムをスレッド化しようとしましたが、GUI がアイドル状態のとき (これはまれです) にのみ別のスレッドを実行します。ありがとうございました!

4

1 に答える 1

2

サポートされていない同期なしで、別のスレッドからテキスト バッファにアクセスしています。これを修正するには、 に置き換えself.txtBuffer.insert(...)ますgobject.idle_add(lambda: self.txtBuffer.insert(...))。これにより、次のメイン ループの繰り返しでテキスト バッファーを更新するように GUI スレッドに指示されます。これは、明示的な同期なしで動作することが保証されています。

GUI スレッドがブロックされていないこと、つまり実行中gtk.main()であり、上記のような GUI 更新のみを処理していることを確認する必要がありますtextBuffer.insert。長時間実行/ブロックするタスクは、コードが既に試みているように、他のスレッドまたはプロセスに委任する必要があります。これが実装されると、GUI の更新が瞬時に行われるように見えます。

PyGTK とスレッド化の詳細については、この回答を参照してください。

于 2013-06-15T11:25:28.610 に答える