Threading: asynchronisierer
Von: Ole Streicher (ole-usenet-spam@gmx.net) [Profil]
Datum: 01.10.2009 16:28
Message-ID: <ytz4oqjchnl.fsf@news.ole.ath.cx>
Newsgroup: de.comp.lang.python
Datum: 01.10.2009 16:28
Message-ID: <ytz4oqjchnl.fsf@news.ole.ath.cx>
Newsgroup: de.comp.lang.python
Hallo, für eine Gui benötige ich eine Möglichkeit, (wiederholte) Aufrufe zu verzögern (falls sinnvoll), den eigentlichen Aufruf direkt zurückkehren zu lassen und den eigentlichen Aufruf asynchron durchzuführen. Falls der Ausgangsaufruf mehrfach eintrifft, reicht ein einziger, zusammengefasster aus. Das ist z.B. sinnvoll, wenn die Gui viele eintreffende Daten anzeigen soll, man aber nicht bei jedem Eintreffen ein eigenes Update durchführen kann. Nach den (auch hier diskutierten) Versuchen, das ad-hoc in den passenden Klassen zu implementieren, habe ich es abgespalten: ----------------------8<------------------------------------------- import threading class UpdateThread(threading.Thread): def __init__(self, func): threading.Thread.__init__(self) self.setDaemon(True) self.c = threading.Condition() self.scheduled = False self.func = func def run(self): while True: self.c.acquire() while not self.scheduled: self.c.wait() self.scheduled = False self.c.release() self.func() def __call__(self): self.c.acquire() self.scheduled = True self.c.notify() self.c.release() ----------------------8<------------------------------------------- Verwendet wird es etwa so: def do_update(): expensive_gui_change() ... update = UpdateThread(do_update) Der Aufruf von update() kehrt nun unmittelbar zurück und wird das do_update() starten. Wiederholte Aufrufe führen dazu, dass do_update() erneut ausgeführt wird, aber nur so oft, dass es einmal nach dem letzten update()-Aufruf ausgeführt wurde. Zu der Implementierung habe ich jetzt zwei Fragen: 1. Das sieht recht allgemein verwendbar aus, sodass sowas vermutlich irgendwo schon als Standardroutine existiert. Dann kann ich meinen Code als Übung betrachten und wegwerfen. Ist das so? 2. Falls nicht: wie bekomme ich es hin, dass der Thread automatisch beendet und weggeräumt wird, wenn er nicht mehr referenziert wird? Viele Grüße Ole[ Auf dieses Posting antworten ]
Antworten
- Mick Krippendorf (02.10.2009 01:26)
- Ole Streicher (02.10.2009 09:43)
- Ole Streicher (02.10.2009 10:16)
- Thomas Rachel (02.10.2009 12:35)
- Thomas Rachel (02.10.2009 12:49)
