1

ソケットを使用してファイルを待機し、その出力を別のスレッドのテキスト フィールドに返す単純なプログラムを作成しようとしています。

私はいくつかの調査を行い、スレッド化の基本がどのように機能するかを知っていますが、複数のスレッドが互いに接続する方法を理解していません。

私の問題は、関数がクラスからではなく、クラス自体WindowManager.addTextのイベントでのみ更新されることです。これを修正して、別のスレッドで呼び出されるたびに即座に更新されるようにするにはどうすればよいですか?WindowManagerConnectionManagerWindowManager.addText

WindowManager文字列をテキスト フィールド (GTK でロード) に保存するクラスを取得しました。

class WindowManager:
    def __init__(self):
        #Load the window here, not relevant
        self.textBuffer = self.messagePanel.get_buffer()
        self.lock = threading.Lock()

    def addText(self, text, *args):
        self.lock.acquire()        
        logging.debug('Waiting for lock')
        try:
            logging.debug('Acquired lock')
            self.textBuffer.insert_with_tags_by_name(self.textBuffer.get_end_iter(), text, *args)
        finally:
            self.lock.release()

ConnectionManagerここで、接続スレッドをロードするクラスも取得しました。

class ConnectionManager:
    def __init__(self, windowManager):
        self.ping = PingThread(windowManager)
        self.ping.setDaemon(True)
        self.ping.start()

そして最後にPingThread、実際の接続スレッドであるクラスを取得しました。この例では、スレッドをランダムに呼び出します。

class PingThread(threading.Thread):
    def __init__(self,  window, group=None, target=None, name=None, verbose=None):
        threading.Thread.__init__(self, group=group, target=target, name=name, verbose=verbose)
        self.window = window

    def run(self):
        while True:
            self.window.addText("Test")
            time.sleep(random.randrange(1,10))
4

1 に答える 1

1

Stack Overflowで検索したところ、答えが見つかりました。私がする必要があるのは、コードの先頭にこれを置いてスレッドを初期化することだけでした。GObject.threads_init()

于 2013-01-10T13:43:09.047 に答える