Laden...

Performanceoptimierung beim rekursiven durchlaufen einer Form

Erstellt von _Bugrick_ vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.454 Views
Thema geschlossen
_
_Bugrick_ Themenstarter:in
48 Beiträge seit 2011
vor 9 Jahren
Performanceoptimierung beim rekursiven durchlaufen einer Form

Hallo zusamen,

ich suche aktuell einen Weg die GUI am Leben zu erhalten, während sie rekursiv durchlaufen und übersetzt wird.

Habe während des Programmstarts ein Preloader.gif in einer Picturebox am laufen, um zu sehen ob die GUI hängt. Während im Hintergrund Datenbankzugriffe laufen, ist das alles kein Problem. Sobald es dann aber ans übersetzen der Controls geht, friert alles ein.

Habe bereits mit Suspendlayout/Resumelayout/DoubleBuffered herumgespielt, jedoch hat das wenig bis nichts geholfen. Es liegt definitiv am Übersetzen, denn wenn ich das nicht aufrufe, ist die GUI voll da.
Das Übersetzen erfolgt ganz schlicht über Rekursion und einem Dictionary.

Hat von euch jemand eine Idee, wie man das am besten angeht?
Zu erwähnen sei vll noch, dass ich hier nicht von 2-3 Button und einem Label spreche, sondern von ca. 60-70 Controls, die auch noch auf einem TableLayoutPanel liegen.

Gruß
Bugrick

1.696 Beiträge seit 2006
vor 9 Jahren
Hinweis von herbivore vor 9 Jahren

gemeint war wohl [FAQ] Warum blockiert mein GUI?

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

16.807 Beiträge seit 2008
vor 9 Jahren

Bringt ja nichts, weil Du im Hintergrundthread das Control nicht anfassen kannst.

Für mich klingt das eher nach einer falschen handhabe, wie eine Lokalisierung der Anwendung vollzogen wird.
Wieso nutzt ihr nicht Ressourcen für die Sprachumstellung von Anwendungen, wozu es auch gedacht ist?
Walkthrough: Localizing Windows Forms

_
_Bugrick_ Themenstarter:in
48 Beiträge seit 2011
vor 9 Jahren

klingt für mich nach
>

Bin ja nur im GUI-Thread unterwegs beim Übersetzen, muss ich ja auch.

Für mich klingt das eher nach einer falschen handhabe, wie eine Lokalisierung der Anwendung vollzogen wird.
Wieso nutzt ihr nicht Ressourcen für die Sprachumstellung von Anwendungen, wozu es auch gedacht ist?

>

Danke! Das klingt interessant, probier ich direkt mal aus. Wirklich einsetzen werde ich das aber auf die Schnelle nicht oder nie können, da wir unsere Übersetzungen zentral auf einer Datenbank einpflegen und beim Programmstart laden.

T
708 Beiträge seit 2008
vor 9 Jahren

Danke! Das klingt interessant, probier ich direkt mal aus. Wirklich einsetzen werde ich das aber auf die Schnelle nicht oder nie können, da wir unsere Übersetzungen zentral auf einer Datenbank einpflegen und beim Programmstart laden.

Hallo Bugrick,

es stellt überhaupt kein Problem da, wenn man die Übersetzungen beim Programmstart zieht und der Form vor der Darstellung übergibt. Da scheint eher noch ein architektonisches Problem zu bestehen.

Wenn Du jedes Mal die gesamte Übersetzung in einem Rutsch lädst, verwende doch einen SplashScreen. Hast Du die Übersetzungen beisammen, übergibst Du diese der Haupt-Form und rufst anschließend Show() auf.

Der Vorteil eines SplashScreens ist, dass dieser i.d.R. in einem anderen Thread läuft und somit die Ladeanimation unabhängig Deiner Datenbankanfrage aktualisieren kann.

Gibt es weitere Forms, so muss man natürlich selbst entscheiden, ob man dessen Übersetzungen schonmal präventiv in einem anderen Thread bezieht, oder beim Initialisieren der entsprechenden Form.
Das kommt dann darauf an wie schnell die Abfrage an die Datenbank von Statten geht.

Hinweis von herbivore vor 9 Jahren

Auch ein Splash-Screen sollte im normalen und einzigen GUI-Thread laufen. Stattdessen gehören die langlaufenden Aktionen (und nur die) in einen extra Thread. So steht es auch in [FAQ] Warum blockiert mein GUI?.

5.657 Beiträge seit 2006
vor 9 Jahren

Hi Bugrick,

solche Probleme könnte man bereits im Vorfeld dadurch umgehen, indem man seine Software-Architektur sorgfältig plant und die einzelnen Schichten trennt.

Christian

Weeks of programming can save you hours of planning

_
_Bugrick_ Themenstarter:in
48 Beiträge seit 2011
vor 9 Jahren

Vielen Dank für deine Antwort!

Wenn Du jedes Mal die gesamte Übersetzung in einem Rutsch lädst, verwende doch einen
>
. Hast Du die Übersetzungen beisammen, übergibst Du diese der Haupt-Form und rufst anschließend Show() auf.

Splashcreen, so nennt man das also 😃 Den Gedanken hatte ich auch schon und hab das bereits ausprobiert. Auch dieser hängt, sobald es in den rekursiven Aufruf geht.
Hab nach jedem SQL-Zugriff einen Haken im Splashscreen gesetzt. Alles ging wundbar, bis dann die eigentliche Form gebaut und übersetzt wird... da hing alles.

Der Vorteil eines SplashScreens ist, dass dieser i.d.R. in einem anderen Thread läuft und somit die Ladeanimation unabhängig Deiner Datenbankanfrage aktualisieren kann.

Das hast du missverstanden. Die Datenbankabfrage läuft sowieso in einem anderen Thread.
Die GUI hängt erst, wenn wirklich das Zugreifen auf die Steuerelemente beginnt.
Genau darin besteht ja die ganze Zeit mein Problem. Datenbankabfragen kann ich so viele machen wie ich will, ohne die GUI zu beeinträchtigen.

S
322 Beiträge seit 2007
vor 9 Jahren

Hallo,

ich mache es ähnlich wie Du mit der Übersetzung. Eine Rekursive Methode geht alle Controls durch und ändert das Control.Text auf die neue Sprache.

Bei mir gibt es keine nennenswerte Verzögerungen, wir haben auch recht viele Controls.
Es müsste also mit deinen Controls zu tun haben.

Du benutzt TableLayoutPanel mit Spalten die automatisch vergrößert werden? evtl. ist hier das Problem da bei jedem Resize von einem Control die Spalten neu angepasst werden. Wenn es wirklich so ist dann teste mal mit SuspendLayout/ResumeLayout von dem TableLayoutPanel.

Gruß
Steffen

_
_Bugrick_ Themenstarter:in
48 Beiträge seit 2011
vor 9 Jahren

solche Probleme könnte man bereits im Vorfeld dadurch umgehen, indem man seine Software-Architektur sorgfältig plant und
>
.

Das tu ich doch: GUI --> Dictionary<string value, string key> --> Datebank

Du benutzt TableLayoutPanel mit Spalten die automatisch vergrößert werden? evtl. ist hier das Problem da bei jedem Resize von einem Control die Spalten neu angepasst werden. Wenn es wirklich so ist dann teste mal mit SuspendLayout/ResumeLayout von dem TableLayoutPanel.

Die Spalten vom TLP sind alle mit Prozentwerten belegt, die Änderung des Textes hat keinen Einfluss auf die Größe der Controls, die darin liegen.
Wenn ihr aber alle meint, dass das theoretisch gehen muss, hab ich irgendwo anders noch einen Performancefresser. Sobald ich weiß wo, sag ich Bescheid.

Trotzdem danke!

5.657 Beiträge seit 2006
vor 9 Jahren

Das tu ich doch: GUI --> Dictionary<string value, string key> --> Datebank

Die Schichtentrennung besteht nicht nur aus unterschiedlichen Datentypen, sondern aus Schnittstellen zwischen den einzelnen Schichten.

Das Lokalisieren ist in deinem Fall Teil der Geschäftslogik, und nicht der Benutzerschnittstelle. Denn die Übersetzungen werden ja auch anderweitig von der Anwendung bearbeitet (bzw. gepflegt). Damit ist auch die BL dafür verantwortlich, für die richtige Zuweisung einer Übersetzung zu sorgen und dafür eine geeignete Schnittstelle zur Verfügung zu stellen.

Die Benutzeroberfläche sollte dann über diese Schnittstelle die aktuelle Lokalisierung abfragen können, und die einzelnen Werte setzen. Dadurch kannst du in einem beliebigen Thread die Lokalisierung abfragen (und im GUI-Thread einen Splashscreen aktualisieren). Und erst dann mußt du im GUI-Thread mit diesen Daten die Benutzeroberfläche aktualisieren. Im besten Fall macht man das, bevor die Form angezeigt wird, damit nicht jedesmal das Layout neu berechnet werden muß.

Christian

Weeks of programming can save you hours of planning

_
_Bugrick_ Themenstarter:in
48 Beiträge seit 2011
vor 9 Jahren

War ja klar. Hat sich doch ein Datenbankzugriff in der Methode versteckt, die übersetzt. Und nicht gerade ein schöner. Auf einen Server, der am anderen Ende der Welt steht macht sich das deutlich bemerkbar. Bin optimistisch, dass es nach dem umbauen dann schneller klappt.

Danke nochmal an alle!

Hinweis von herbivore vor 9 Jahren

Auch hier liegt keine Situation vor, die nicht durch [FAQ] Warum blockiert mein GUI? und [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) hätte geklärt werden können.

Thema geschlossen