Threads voneinander abhängig

Plattformunabhängige GUIs mit wxWidgets.
Antworten
sylenz
User
Beiträge: 19
Registriert: Dienstag 21. Juli 2009, 05:12

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
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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

wx.lib.pubsub = Publisher()
the more they change the more they stay the same
BlackJack

Komische Entwurfsentscheidung das man das Teil jedesmal *aufrufen* muss statt das "singleton" einfach als Attribut auf dem Modul verfügbar zu machen.
Antworten