Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Performanceoptimierung beim rekursiven durchlaufen einer Form
_Bugrick_
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

Performanceoptimierung beim rekursiven durchlaufen einer Form

beantworten | zitieren | melden

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_
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Bugrick_ am .
private Nachricht | Beiträge des Benutzers
vbprogger
myCSharp.de - Experte

Avatar #avatar-1820.gif


Dabei seit:
Beiträge: 1723
Herkunft: NRW/DE

beantworten | zitieren | melden

Hallo,

klingt für mich nach [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)

Grüße
Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.
---------
Bemerkung: ich beantworte keine Fragen via PM, denn das Forum soll ja was davon haben!

Moderationshinweis von herbivore (25.09.2014 - 07:53:47):

gemeint war wohl [FAQ] Warum blockiert mein GUI?

private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16098

beantworten | zitieren | melden

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
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
_Bugrick_
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

beantworten | zitieren | melden

Zitat von vbprogger
klingt für mich nach [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)

Bin ja nur im GUI-Thread unterwegs beim Übersetzen, muss ich ja auch.
Zitat von Abt
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

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Bugrick_ am .
private Nachricht | Beiträge des Benutzers
trib
myCSharp.de - Member



Dabei seit:
Beiträge: 691

beantworten | zitieren | melden

Zitat von _Bugrick_
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.

Moderationshinweis von herbivore (25.09.2014 - 07:56:00):

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?.

private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5983
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
_Bugrick_
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

beantworten | zitieren | melden

Vielen Dank für deine Antwort!
Zitat von trib
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.

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.
Zitat von trib
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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Bugrick_ am .
private Nachricht | Beiträge des Benutzers
steffen_dec
myCSharp.de - Member



Dabei seit:
Beiträge: 325

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
_Bugrick_
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

beantworten | zitieren | melden

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

Das tu ich doch: GUI --> Dictionary<string value, string key> --> Datebank
Zitat von steffen_dec
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!
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Bugrick_ am .
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5983
Herkunft: Leipzig

beantworten | zitieren | melden

Zitat von _Bugrick_
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
private Nachricht | Beiträge des Benutzers
_Bugrick_
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers

Moderationshinweis von herbivore (25.09.2014 - 07:58:53):

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.