Hallo!
Ich habe mich heute schon den halben Tag mit Threads rumgeschlagen und habe immer noch ein Verständnissproblem
Ich habe in meiner Anwendung je nach Tasks längere Berechnungen laufen und starte deswegen eine wxBusyInfo. Leider reagiert das Programm bis zum Abschluss der Berechnung garnicht bzw. die wxBusyInfo friert ein.
Stark vereinfacht:
Start Button -> start wx.BusyInfo -> lange Berechnung -> Berechnung fertig -> zerstöre wx.BusyInfo
Was genau baue ich jetzt in den Thread ein? Alles oder nur die Berechnung oder die Info Box
Habe ich das richtig verstanden, dass die Berechnung und die wx.BusyInfo in den Thread (in die "run" Funktion um beim Wiki Beispiel zu bleiben) gepackt werden und der Thread dann im wx.Frame gestartet wird?
Für jede Aufklärung, wäre ich dankbar
Schönen Abend noch
Threads - Verständnissfrage
http://www.snowflake-sl.info/index.html
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
Also von dem wx-Zeug habe ich keine Ahnung, aber die Berechnung (und NUR die Berechnung) sollte im Thread passieren. Dann brauchst ggf. du noch irgend einen Timer, um alle Sekunden (z.B.) Feedback über den Fortschritt zu bekommen, um dann einen Fortschrittsbalken anzuzeigen o.ä. wx bringt da bestimmt was mit.
Wie Dauerbaustelle schon erwähnt hat, die GUI nur im Haupthread updaten (mit wx.Yield zB.) Dort kann dann eine Progressbar zB aktualisiert werden.
Zusätzlich interessant wäre da noch:
in Demo: Process And Events => Threads
oder auch:
http://wiki.wxpython.org/LongRunningTasks
Ah ja, das BusyInfo darf man nicht zerstören (busy_info.Destroy()), sondern löschen (del busy_info). Da bin ich auch schon mal drübergestolpert. Warum weiss ich jetzt auch nicht mehr...
Zusätzlich interessant wäre da noch:
in Demo: Process And Events => Threads
oder auch:
http://wiki.wxpython.org/LongRunningTasks
Ah ja, das BusyInfo darf man nicht zerstören (busy_info.Destroy()), sondern löschen (del busy_info). Da bin ich auch schon mal drübergestolpert. Warum weiss ich jetzt auch nicht mehr...
@Francesco, wieso darf man BusyInfo nicht "zerstören", mit del wird auch nicht das BusyInfo Fenster "gelöscht"
wx.Yield würde ich nicht nehmen, das ist ne Krankheit. Threads (aus threading), am besten ne eigene Threadklasse (am Einfachsten), dann gibt es noch (wx.lib.)pubsub, wx.lib.newevent und wx.PostEvent. Ich würde pubsub verwenden.
Wie das mit Thread-Klassen und wx.PostEvent bzw. wx.lib.newevent funktioniert siehste hier: http://bitbucket.org/dav1d/mplayerctrl/ ... .py#cl-724, http://bitbucket.org/dav1d/mplayerctrl/ ... .py#cl-899, http://bitbucket.org/dav1d/mplayerctrl/ ... l.py#cl-88
//Edit: wx.CallAfter hab ich noch vergessen
wx.Yield würde ich nicht nehmen, das ist ne Krankheit. Threads (aus threading), am besten ne eigene Threadklasse (am Einfachsten), dann gibt es noch (wx.lib.)pubsub, wx.lib.newevent und wx.PostEvent. Ich würde pubsub verwenden.
Wie das mit Thread-Klassen und wx.PostEvent bzw. wx.lib.newevent funktioniert siehste hier: http://bitbucket.org/dav1d/mplayerctrl/ ... .py#cl-724, http://bitbucket.org/dav1d/mplayerctrl/ ... .py#cl-899, http://bitbucket.org/dav1d/mplayerctrl/ ... l.py#cl-88
//Edit: wx.CallAfter hab ich noch vergessen
the more they change the more they stay the same
Es scheint zu funktionieren, zumindest hat es dies an einem minimalistischen Beispiel meiner Anwendung.
Durch Threads wird mir auch die Objektorientierung klarer
Danke und liebe Grüsse
Durch Threads wird mir auch die Objektorientierung klarer
Danke und liebe Grüsse
http://www.snowflake-sl.info/index.html
Weiss ich auch nicht mehr genau, vielleicht funktionierts ja (wieder). In einer früheren wxPy Version war das mal so. Du hast recht, es ist eigentlich höchst unlogisch-Dav1d hat geschrieben:@Francesco, wieso darf man BusyInfo nicht "zerstören", mit del wird auch nicht das BusyInfo Fenster "gelöscht"
Nachtrag, jetzt gefunden:
"That works too. The key point is that the wxBusyInfo C++ class is designed such that it is shown when it is created and continues to exist until the instance is destroyed. So in order to make the info window go away we need to cause the instance to loose all references. That can either happen naturally as the function defining the local variable exits or the owning object is destroyed, or it can be forced using del or reassigning the only variable that refers to the instance. There are a few classes like this in wx, but wx.BusyInfo is probably the most commonly used."
(aus http://markmail.org/message/zmhvah63vkkwk4fg)
Ahm, warum?Dav1d hat geschrieben: wx.Yield würde ich nicht nehmen, das ist ne Krankheit.
Siehe auch hier:
http://groups.google.com/group/wxpython ... b8f2335?q=#
http://groups.google.com/group/wxpython ... b8f2335?q=#
http://www.snowflake-sl.info/index.html
Ok, wieder was gelernt.
mit wx.Yield hatte ich nur Probleme, als es endlich lief, Skript zum Freund geschickt (für den ichs geschrieben habe) und es ging nicht (GUI hat blockiert). Mit Threads lief es ohne Probleme.
mit wx.Yield hatte ich nur Probleme, als es endlich lief, Skript zum Freund geschickt (für den ichs geschrieben habe) und es ging nicht (GUI hat blockiert). Mit Threads lief es ohne Probleme.
the more they change the more they stay the same