ソケットを使用してファイルを待機し、その出力を別のスレッドのテキスト フィールドに返す単純なプログラムを作成しようとしています。
私はいくつかの調査を行い、スレッド化の基本がどのように機能するかを知っていますが、複数のスレッドが互いに接続する方法を理解していません。
私の問題は、関数がクラスからではなく、クラス自体WindowManager.addText
のイベントでのみ更新されることです。これを修正して、別のスレッドで呼び出されるたびに即座に更新されるようにするにはどうすればよいですか?WindowManager
ConnectionManager
WindowManager.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))