(Re-) Paint von Controls verhindern

Rund um die LCL und andere Komponenten

(Re-) Paint von Controls verhindern

Beitragvon kupferstecher » 27. Aug 2018, 19:12 (Re-) Paint von Controls verhindern

Hallo zusammen,

wie im Betreff geschrieben suche ich eine Möglichkeit für bestimmte graphische Komponenten ein neuzeichenen zu verhindern, d.h. zeitweise zu deaktivieren. Hintergrund ist der, dass die Komponenten vom Benutzer angepasst/eingestellt und abgespeichert werden können. Beim nächsten Öffnen werden die Eigenschaften nacheinander geladen, über Setter und Getter, die jeweils ein Neuzeichen auslösen. Das macht das Laden sehr langsam. Ich möchte also das Neuzeichen deaktivieren, alle Eigenschaften laden und dann automatisches Neuzeichen wieder aktivieren. Die meisten Eigenschaften "stecken" in Child-Komponenten, das Neuzeichen muss also auch für diese unterbunden werden.

Welche Möglichkeiten gibt es? Oder macht man das ganz anders?

Viele Grüße
kupferstecher
kupferstecher
 
Beiträge: 165
Registriert: 17. Nov 2016, 11:52

Beitragvon Warf » 27. Aug 2018, 20:09 Re: (Re-) Paint von Controls verhindern

kupferstecher hat geschrieben:Hallo zusammen,

wie im Betreff geschrieben suche ich eine Möglichkeit für bestimmte graphische Komponenten ein neuzeichenen zu verhindern, d.h. zeitweise zu deaktivieren. Hintergrund ist der, dass die Komponenten vom Benutzer angepasst/eingestellt und abgespeichert werden können. Beim nächsten Öffnen werden die Eigenschaften nacheinander geladen, über Setter und Getter, die jeweils ein Neuzeichen auslösen. Das macht das Laden sehr langsam. Ich möchte also das Neuzeichen deaktivieren, alle Eigenschaften laden und dann automatisches Neuzeichen wieder aktivieren. Die meisten Eigenschaften "stecken" in Child-Komponenten, das Neuzeichen muss also auch für diese unterbunden werden.

Welche Möglichkeiten gibt es? Oder macht man das ganz anders?

Viele Grüße
kupferstecher


Das brauchst du nicht, repaint/invalidate, etc sorgen dafür das die repaint Message gequeued wird. Die wird nur abgearbeitet wenn die Form idled. Solang du also in einer eigenen Methode/Funktion bist wird eh nix neugezeichnet, und der einzige overhead ist das intern irgendwo win Boolean auf true gesetzt wird.

Es gibt einiges controls bei denen ist das anders (z.b. Listbox), die haben dann aber eine beginupdate und endupdate Methode die sich darum kümmert
Warf
 
Beiträge: 984
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon kupferstecher » 27. Aug 2018, 20:26 Re: (Re-) Paint von Controls verhindern

Hm, dann muss ich nochmal genauer schauen wo die vielen Repaints herkommen. Ich lass mir den Aufruf einiger Setter in der Konsole auflisten, außerdem wenn die Paint-Methode von CustomControls aufgerufen wird. Und das ist schon eine beträchtliche Liste an Neuzeichnungen.

Wenn in der Queue mehrere Invalidate für das gleiche Control auflaufen, werden die dann zu einem zusammengefasst, oder trotzdem komplett abgearbeitet?
kupferstecher
 
Beiträge: 165
Registriert: 17. Nov 2016, 11:52

Beitragvon Warf » 27. Aug 2018, 20:40 Re: (Re-) Paint von Controls verhindern

kupferstecher hat geschrieben:Hm, dann muss ich nochmal genauer schauen wo die vielen Repaints herkommen. Ich lass mir den Aufruf einiger Setter in der Konsole auflisten, außerdem wenn die Paint-Methode von CustomControls aufgerufen wird. Und das ist schon eine beträchtliche Liste an Neuzeichnungen.

Wenn in der Queue mehrere Invalidate für das gleiche Control auflaufen, werden die dann zu einem zusammengefasst, oder trotzdem komplett abgearbeitet?


Du solltest niemals die paint Methode selbst aufrufen, sondern immer repaint oder invalidate verwenden, um genau sowas zu vermeiden. Unter anderen widgetsets wie Carbon unter OSX kannst du außerhalb des paint Events der Lcl (also wenn du die paint Funktion per Hand aufrufst) sogar gar nicht zeichnen.

Um das handeln der Events kümmert sich Windows (oder gtk, etc.) intern, da mach dir mal keine Gedanken, das ist schon recht effizient gebaut damit nix doppelt aufgerufen wird. Also egal ob du 5 mal invalidate oder 1 mal aufrufst, es wird nur einmal gezeichnet
Warf
 
Beiträge: 984
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon kupferstecher » 27. Aug 2018, 20:53 Re: (Re-) Paint von Controls verhindern

Paint ruf ich nicht selber auf, sondern die Paintmethode gibt eine Statusmeldung, dass sie gerufen wurde. Sonst bekomme ich ja nicht mit, wie oft neu gezeichnet wird.
Den Grund für das Repaint hab ich jetzt gefunden. Und zwar erstelle ich immer "Screenshots" von den Komponenten mit der PaintTo-Methode von TWinControl. Das verursacht sinnvollerweise ein sofortiges Neuzeichnen. Allerdings ist das Laden immernoch langsam, trotz deaktiviertem PaintTo. Liegt wohl an etwas anderem...
kupferstecher
 
Beiträge: 165
Registriert: 17. Nov 2016, 11:52

Beitragvon wp_xyz » 28. Aug 2018, 09:18 Re: (Re-) Paint von Controls verhindern

Verwendest du evtl Win10? Seit einem der letzten Win-Updates werden beim Öffnen eines Formulars Unmengen von WM_ENABLE Nachrichten abgesetzt, was zu Verzögerungen von bis zu einer halben Minuten führen kann, wenn das Formular viele Controls enthält. Im aktuellen Lazarus-Trunk ist das behoben.
wp_xyz
 
Beiträge: 2647
Registriert: 8. Apr 2011, 08:01

Beitragvon kupferstecher » 28. Aug 2018, 21:26 Re: (Re-) Paint von Controls verhindern

Hallo wp,

ich verwende Win7, mit Lazarus 1.8.0.

Gibt es eine Möglichkeit alle gerufenen Procedures protokollieren zu lassen? Also nicht nur wie man zu einer Procedure gelangt ist (Aufrufstack), sondern welche Proceduren nacheinander abgearbeitet wurden.
kupferstecher
 
Beiträge: 165
Registriert: 17. Nov 2016, 11:52

Beitragvon wp_xyz » 28. Aug 2018, 22:48 Re: (Re-) Paint von Controls verhindern

http://wiki.lazarus.freepascal.org/LazLogger

Nimm LazLogger mit in die Uses-Liste auf und schreibe an den Anfang jeder Routine, die du protokollieren möchtest, ein "DebugLn(<Prozedurname>, evtl Parameter)". Entferne unter Windows in den Projekt-Optionen das Häkchen vor "Win32 GUI Application", um diese Meldungen in die Konsole zu schreiben, oder rufe das Programm mit den Parameter --debug-log=dateiname auf, um sie in die genannte Datei zu schreiben. Im Gegensatz zu WriteLn gibt es keinen Absturz wenn das Häkchen bei "Win32 GUI Application" gesetzt bleibt. Es ist allerdings ratsam, die DebugLn-Aufrufe mit einem $IFDEF LOGGING o.ä. zu umgeben, damit sie nur bei Bedarf eingebunden werden.
wp_xyz
 
Beiträge: 2647
Registriert: 8. Apr 2011, 08:01

Beitragvon kupferstecher » 29. Aug 2018, 20:00 Re: (Re-) Paint von Controls verhindern

Ich habe gehofft es gibt da was Automatisches. Mir würden auch erstmal nur die zwischen zwei Ausführungspunkten gerufenen Units reichen. Ich könnte mir ein Tool, das den Debugger nutzt oder eine Art Präprozessor, der Logging-Code einfügt, vorstellen. Oder sogar ein offline Codeanalyseprogramm, das bspw zu einer gegebenen Prozedur alle darin Aufgerufenen Prozeduren und darunter aufgerufene auflistet. Aber kann gut sein, dass es sowas nicht gibt.
Mein Problem ist einfach, dass ich kein Überblick über die Abhängigkeiten und Nebenläufigkeiten mehr hab, es handelt sich um ein schon größeres Programm.
kupferstecher
 
Beiträge: 165
Registriert: 17. Nov 2016, 11:52

Beitragvon Socke » 30. Aug 2018, 16:33 Re: (Re-) Paint von Controls verhindern

kupferstecher hat geschrieben:eine Art Präprozessor, der Logging-Code einfügt, vorstellen.

FPProfiler macht genau das, wobei die Auswertungen ein wenig zu Wünschen übrig lässt.

Profiling unter Windows ist ein wenig haarig, weil es zumindest für die Lazarus-Toolchain kaum brauchbare Tools gibt. Unter Linux sieht das ganze anders aus.

Für mich neu gefunden habe ich gerade LazProfiler (Wiki-Seite existiert erst seit Nov. 2017); laut Beschreibung arbeitet es ähnlich wie FPProfiler.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Socke
 
Beiträge: 2546
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 8.1/Debian GNU/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon kupferstecher » 30. Aug 2018, 17:19 Re: (Re-) Paint von Controls verhindern

Hallo Socke,

hört sich gut an, Danke!
kupferstecher
 
Beiträge: 165
Registriert: 17. Nov 2016, 11:52

• Themenende •

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

cron
porpoises-institution
accuracy-worried