DatenMetzgerX hat geschrieben:Also Event aufrufen und Return Value einer Variablen zuweisen. Nur gibt wx.PostEvent(....) keine Werte zurück.
Hi DM!
Dazu sind Events nicht geschaffen worden. Events werden ausgelöst -- danach läuft das Programm weiter, ohne abzuwarten, ob etwas zurück kommt oder nicht. Die einzige Möglichkeit, die ich in Verbindung mit Events sehe: Du definierst ein Queue-Objekt, das du über das Event übergibst und wartest sofort danach darauf, dass dir etwas über das Queue-Objekt übergeben wird.
Allerdings würde ich das nie machen, da das meiner Meinung nach die Stabilität deines Programmes extrem beeinflussen kann. Was ist, wenn dir aus irgendeinem Grund nichts über das Queue-Objekt zurück gegeben wird? Dein Programm würde unweigerlich hängen.
Du kannst beim Auslösen, Daten über die Event-Klasse an den Event-Handler (=die Funktion die das Event empfängt) übergeben. Wie das geht, habe ich oben im Beispiel bereits demonstriert. (siehe self.mein_parameter)
Allerdings ist das eine einseitige Sache. Du bekommst nichts zurück, weil das bedeuten würde, dass das Programm an dieser Stelle auf eine Rückgabe warten müsste. Dazu sind Funktionen und Methoden da. Wenn du eine Methode eines anderen Objektes aufrufst, dann wird dein Programm erst dann fortgesetzt, wenn die Methode ein Ergebnis zurück liefert.
Die Allgemeine Vorgehensweise bei Events sollte die sein, dass zuerst von einem Objekt ein Event ausgelöst wird. Der Event-Handler, arbeitet etwas ab, holt sich z.B. Informationen und ruft beim auslösenden Objekt eine Methode auf. An diese Methode werden wieder Werte übergeben, mit denen das vormals auslösende Objekt etwas anfangen soll.
Fazit: Designe dein Programm so, dass es asyncron läuft. Sollte ein Thread immer wieder neue Daten brauchen, dann übergib sie *threadsave*, also z.B. über eine Queue. Wenn du Daten von einem Thread an den Hauptthread übergeben möchtest, dann rufe mit wx.CallAfter() eine Methode deines Hauptthreads auf, an die du die Daten übergeben kannst.
Wenn du bei diesen vorgängen immer auf die Ergebnisse warten musst, dann brauchst du keine Threads.
Ich weis, dass ist alles ein wenig theoretisch, aber vielleicht hilft es dir ja weiter.
mfg
Gerold
