Seite 1 von 1

Threads voneinander abhängig

Verfasst: Dienstag 5. Oktober 2010, 15:12
von sylenz
Hallo Forum,
ich beschäftige mich gerade ein bisschen mit Threads und habe ein kleines Verständnisproblem bezüglich der Kommunikation untereinander.

Afaik unterhalten sich Threads ja nicht untereinander, und ich benötige quasi einen Controller der das starten / stoppen steuert.

Beispiel: Ein Thread führt eine Berechnung durch und in der Zwischenzeit soll in einer Textbox Punkte erzeugt werden.

Mein Ansatz:
Ein Thread für die Berechnung

Code: Alles auswählen

class Berechnung(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self):
            self.running = True
    def run(self):   
        for i in range(10):
            time.sleep(1) # oder was auch immer
        self.running = False
Und ein Thread für die Punkte:

Code: Alles auswählen

class Punkt(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self):
            self.running = True
    def run(self):   
        while self.running:
            wx.CallAfter(Publisher().sendMessage("zeichne",1)) #Veränderung der GUI innerhalb des Threads verboten
Nun starte ich in meiner GUI die beiden Threads und lasse den Publisher lauschen:

Code: Alles auswählen

go = Berechnung()
go.start()
go2 = Punkt()
go2.start()
Publisher().subscribe(self.drawpoint,"zeichne")
In der Funktion drawpoint lasse ich dann einfach den Punkt ausgeben - nur wie kann ich die Ausgabe hierfür wieder stoppen - also auf die Eigenschaft self.running des Threads Berechnung zugreifen?
Eine Idee wäre, eine Controller-Funktion, welche am Ende des Berechnungsthreads mittels CallAfter aufgerufen wird - nur kann diese Funktion dann wieder nicht auf den Punkte-Thread zugreifen.
Also die Controller-Funktion direkt beide Threads starten und verwalten lassen?!
Oder ist der Ansatz total verkehrt und es gibt noch eine wesentlich elegantere Möglichkeit?

Danke schonmal
Gruß
Steffen

Re: Threads voneinander abhängig

Verfasst: Dienstag 5. Oktober 2010, 15:48
von BlackJack
@sylenz: Wenn Du `wxPython` verwendest, würde ich da eher auf die Bordmittel wie `wx.Timer`, `wx.lib.delayedresult`, und `wx.ProgressDialog` setzen als selber etwas in der Richtung zu basteln.

Was ist denn `Publisher` in Deinem Quelltext? Das sieht irgendwie komisch aus.

Re: Threads voneinander abhängig

Verfasst: Dienstag 5. Oktober 2010, 16:29
von Dav1d
wx.lib.pubsub = Publisher()

Re: Threads voneinander abhängig

Verfasst: Dienstag 5. Oktober 2010, 17:13
von BlackJack
Komische Entwurfsentscheidung das man das Teil jedesmal *aufrufen* muss statt das "singleton" einfach als Attribut auf dem Modul verfügbar zu machen.