Threads - Verständnissfrage

Plattformunabhängige GUIs mit wxWidgets.
Antworten
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Hallo!

Ich habe mich heute schon den halben Tag mit Threads rumgeschlagen und habe immer noch ein Verständnissproblem :roll:

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 :oops:

Schönen Abend noch :wink:
http://www.snowflake-sl.info/index.html
Dauerbaustelle
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.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

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

@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 ;)
the more they change the more they stay the same
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Es scheint zu funktionieren, zumindest hat es dies an einem minimalistischen Beispiel meiner Anwendung.
Durch Threads wird mir auch die Objektorientierung klarer :o

Danke und liebe Grüsse
http://www.snowflake-sl.info/index.html
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Dav1d hat geschrieben:@Francesco, wieso darf man BusyInfo nicht "zerstören", mit del wird auch nicht das BusyInfo Fenster "gelöscht"
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-

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)
Dav1d hat geschrieben: wx.Yield würde ich nicht nehmen, das ist ne Krankheit.
Ahm, warum?
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

http://www.snowflake-sl.info/index.html
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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.
the more they change the more they stay the same
Antworten