Viele Panels auf dem Formular = Programm extrem langsam
-
Targion
- Beiträge: 688
- Registriert: Mi 3. Okt 2007, 21:00
- OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
- CPU-Target: x86_64
Viele Panels auf dem Formular = Programm extrem langsam
Hallo!
Ich habe ein Programm geschrieben, welches Panels auf einem Formular erstellt, um Informationen daraus anzuzeigen, Von den panels gibt es nach dem Laden der Liste über 100 Stück.
Wärend des Ladens reagieren alle übrigen controls auf dem Form flüssig, skalieren und Schließen des Fensters ist möglich. Sobald jedoch der Ladevorgang beendet ist, verhält sich das Formular sehr zäh, d.H. Controls reakieren auf Klicks erst über 18 Sekunden später, ein resize des Forms dauert und schließen tut sich das Fenster auch nicht.
Kann Lazarus wirklich nicht mit vielen so vielen Panels umgehen? Wieso funktioniert alles wären der Ladezeit wie es soll und später nicht mehr?
Ich habe ein Programm geschrieben, welches Panels auf einem Formular erstellt, um Informationen daraus anzuzeigen, Von den panels gibt es nach dem Laden der Liste über 100 Stück.
Wärend des Ladens reagieren alle übrigen controls auf dem Form flüssig, skalieren und Schließen des Fensters ist möglich. Sobald jedoch der Ladevorgang beendet ist, verhält sich das Formular sehr zäh, d.H. Controls reakieren auf Klicks erst über 18 Sekunden später, ein resize des Forms dauert und schließen tut sich das Fenster auch nicht.
Kann Lazarus wirklich nicht mit vielen so vielen Panels umgehen? Wieso funktioniert alles wären der Ladezeit wie es soll und später nicht mehr?
-
Euklid
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 10:38
- OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
- Wohnort: Hessen
- Kontaktdaten:
Re: Viele Panels auf dem Formular = Programm extrem langsam
Hmm. Das ist merkwürdig und ganz sicher nicht so gewollt.
Was sagt denn der Task-Manager über den Speicherverbrauch und die CPU-Last des Programms?
Euklid
Was sagt denn der Task-Manager über den Speicherverbrauch und die CPU-Last des Programms?
Euklid
-
Targion
- Beiträge: 688
- Registriert: Mi 3. Okt 2007, 21:00
- OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
- CPU-Target: x86_64
Re: Viele Panels auf dem Formular = Programm extrem langsam
Wenn alles geladen ist liegt der Verbrauch bei 30,892 K. Die CPU Auslastung des Programmes beträgt jedoch fast 50%. Das sollte wirklich nicht so sein.
P.S: Ich nutze Linux, das Verhalten tritt mit Qt4 und GTK2 auf, in Lazarus 0.9.27-SVN ist dieses Verhalten auch enthalten. Auf den Panels befinden sich Bilder und Labels, aber das ist egal, da die Anwendung ja tut was sie soll, aber nur während die Liste aufgebaut wird. Währenddessen wächst der Speicherverbrauch des Programmes natürlich kontinuierlich an.
Am Ende sind es - ich korrigiere - über 2000 Panels.
P.S: Ich nutze Linux, das Verhalten tritt mit Qt4 und GTK2 auf, in Lazarus 0.9.27-SVN ist dieses Verhalten auch enthalten. Auf den Panels befinden sich Bilder und Labels, aber das ist egal, da die Anwendung ja tut was sie soll, aber nur während die Liste aufgebaut wird. Währenddessen wächst der Speicherverbrauch des Programmes natürlich kontinuierlich an.
Am Ende sind es - ich korrigiere - über 2000 Panels.
-
Christian
- Beiträge: 6079
- Registriert: Do 21. Sep 2006, 07:51
- OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
- CPU-Target: AVR,ARM,x86(-64)
- Wohnort: Dessau
- Kontaktdaten:
Re: Viele Panels auf dem Formular = Programm extrem langsam
Ich denke da ist in deinem Code noch irgendwas faul, dein Programm führt warscheinlich noch irgendwelche Schleifen aus o.ä. ich hab etliche Formulare mit an die 100 Controls und de sind eigentlich recht akzeptable von der Geschwindigkeit.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/
-
Targion
- Beiträge: 688
- Registriert: Mi 3. Okt 2007, 21:00
- OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
- CPU-Target: x86_64
Re: Viele Panels auf dem Formular = Programm extrem langsam
Okay... Es liegt definitiv an den Controls. Ich habe unten die Unit mit meiner Klasse angehängt - ein Teil meines Listaller-Projektes, der momentan genutzt wird, um eine AppInstall-Funktion für Kubuntu zu bauen, welche durch das entfernen von Adept verloren ging.
Wenn man von dieser Klasse 2000 Stück z.B. in einer ScrollBox erstellt, kann man das beschriebene Verhalten beobachten. Hat jemand eine Idee, wie man das umgehen kann? (Die Klasse ist evtl. nicht ganz sauber programmiert)
P.S: Die Labels und Bildfelder müssen nicht extra mit Inhalt gefüllt werden! Auch ohne Bilder kann man die Wirkung sehen.
Wenn man von dieser Klasse 2000 Stück z.B. in einer ScrollBox erstellt, kann man das beschriebene Verhalten beobachten. Hat jemand eine Idee, wie man das umgehen kann? (Die Klasse ist evtl. nicht ganz sauber programmiert)
P.S: Die Labels und Bildfelder müssen nicht extra mit Inhalt gefüllt werden! Auch ohne Bilder kann man die Wirkung sehen.
- Dateianhänge
-
- applist.pas
- applist.pas des QAppInstall-Tools
- (3.2 KiB) 76-mal heruntergeladen
-
Hitman
- Beiträge: 512
- Registriert: Mo 25. Aug 2008, 18:17
- OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
- CPU-Target: x86
- Wohnort: Chemnitz
Re: Viele Panels auf dem Formular = Programm extrem langsam
Da hätte ich durchaus eine Idee - die wohl einzig saubere: OwnerDraw 
Also nicht tausend Komponenten erstellen und die Scrollbox alles handeln lassen, sondern selbst zeichnen. Dass das gut funktioniert, sieht man an der Mächtigkeit des Virtual(String/Draw)Tree.
Der wäre ggf. sogar ein guter Ausgangspunkt, wenn du nicht alles selbst machen willst.
Also nicht tausend Komponenten erstellen und die Scrollbox alles handeln lassen, sondern selbst zeichnen. Dass das gut funktioniert, sieht man an der Mächtigkeit des Virtual(String/Draw)Tree.
Der wäre ggf. sogar ein guter Ausgangspunkt, wenn du nicht alles selbst machen willst.
-
Targion
- Beiträge: 688
- Registriert: Mi 3. Okt 2007, 21:00
- OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
- CPU-Target: x86_64
Re: Viele Panels auf dem Formular = Programm extrem langsam
Du meinst alles - inclusive Scrollbar - mit OwnerDraw direkt zeichnen? Das scheint mir ein ziemlicher Aufwand für diesen eher bescheidenen Zweck. Ich werde erstmal alle Labels entfernen und mal schauen, wie sich die Komponente dann verhält.
-
Hitman
- Beiträge: 512
- Registriert: Mo 25. Aug 2008, 18:17
- OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
- CPU-Target: x86
- Wohnort: Chemnitz
Re: Viele Panels auf dem Formular = Programm extrem langsam
Scrollbar eigentlich nicht ... die ist ja in jedem guten WinControl vorhanden 
Aber alles andere ist doch kaum problematisch ... Text, Icons, Linien ... geht alles wunderbar über den Canvas. Wie gesagt - ich denke, VirtualDrawTree könnte schon genau das sein, was du brauchst.
Aber alles andere ist doch kaum problematisch ... Text, Icons, Linien ... geht alles wunderbar über den Canvas. Wie gesagt - ich denke, VirtualDrawTree könnte schon genau das sein, was du brauchst.
-
Targion
- Beiträge: 688
- Registriert: Mi 3. Okt 2007, 21:00
- OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
- CPU-Target: x86_64
Re: Viele Panels auf dem Formular = Programm extrem langsam
VST ist zumindest schnell... Aber ich habe Ewigkeiten nichts mehr damit gemacht... Ich suche mir jetzt erst mal ein gutes Tutorial oder Beispielprogramm und schreibe dann die Klasse neu. Mal sehen, ob es unter Linux/Lazarus überhaupt läuft.
-
Socke
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Viele Panels auf dem Formular = Programm extrem langsam
Warum benutzt du TPanel, wenn die nur ein Label und ein Bild enthalten sollen?
Wenn du die Positionierung im Quelltext vornimmst, sollte es kein Problem sein, eine neue Klasse von TControl oder TCustomControl abzuleiten. Ich weiß zwar nicht, ob das dein Problem löst, aber ich finde den Ansatz schön OOP, wenn man sowas machen will.
MfG Socke
Wenn du die Positionierung im Quelltext vornimmst, sollte es kein Problem sein, eine neue Klasse von TControl oder TCustomControl abzuleiten. Ich weiß zwar nicht, ob das dein Problem löst, aber ich finde den Ansatz schön OOP, wenn man sowas machen will.
MfG Socke
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
pluto
- Lazarusforum e. V.
- Beiträge: 7193
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Viele Panels auf dem Formular = Programm extrem langsam
Es gibt Effektivere Möglichkeiten, wenn du wirklich nur ein Image und ein Label anzeigen möchtest.
Z.B. könntest du alle Informationen über eine Klasse in eine TObject List eintragen und diese dann in einer ListBox oder VST anzeigen lassen und bei drauf Klicken wird dann eine TImage Komponente mit einem Bild gefühlt und einem Label mit einem Text und Fertig. Diese Varainte währe schnell eingebaut und würde auch nicht so viel speicher Platzt benötigen. Allerdings muss du einmal alle Daten in die TObjectList übertragen z.b. über eine Datei die du Parst.
PS:
Mir fällt gerade ein das du ja ein Pack Verawaltungs Programm schreibt da es ist ja üblich so viele Informationen anzuzeigen, dafür würde müss man das verfahren von Oben anpassen z.b. das du auf einmal 50 oder 20 Einträge anzeigst statt 100.
Z.B. könntest du alle Informationen über eine Klasse in eine TObject List eintragen und diese dann in einer ListBox oder VST anzeigen lassen und bei drauf Klicken wird dann eine TImage Komponente mit einem Bild gefühlt und einem Label mit einem Text und Fertig. Diese Varainte währe schnell eingebaut und würde auch nicht so viel speicher Platzt benötigen. Allerdings muss du einmal alle Daten in die TObjectList übertragen z.b. über eine Datei die du Parst.
PS:
Mir fällt gerade ein das du ja ein Pack Verawaltungs Programm schreibt da es ist ja üblich so viele Informationen anzuzeigen, dafür würde müss man das verfahren von Oben anpassen z.b. das du auf einmal 50 oder 20 Einträge anzeigst statt 100.
MFG
Michael Springwald
Michael Springwald
-
Targion
- Beiträge: 688
- Registriert: Mi 3. Okt 2007, 21:00
- OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
- CPU-Target: x86_64
Re: Viele Panels auf dem Formular = Programm extrem langsam
Das klingt sehr gut! Dann muss ich nämlich keine Fremdkomponenten einbauen.
Die ObjectList ist eine elegantere Lösung, aber wie genau soll ich denn dann die Liste mit einer ListBox verknüpfen?
Die ObjectList ist eine elegantere Lösung, aber wie genau soll ich denn dann die Liste mit einer ListBox verknüpfen?
-
pluto
- Lazarusforum e. V.
- Beiträge: 7193
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Viele Panels auf dem Formular = Programm extrem langsam
Wenn du eine ListBox verwenden möchtest, brauchst du keine TObjectList.
Dann würde ich die Object Eigenschaft der TStringList(Welches von der TListbox verwendet wird) nutzen. In Etwa so:
ich hoffe du kannst damit was anfangen.
Wenn nicht: Schau dir mal bzw. such mal nach TStringlist.AddObject. Die TListBox verwendet die TStringList intern. Um genau zu sein: TListBox.Items ist die TStringList. Das ist der einfachste Weg, aber ich weiß nicht wie es mit den Speicher verbrauch aussieht. Du möchtest ja verschiedene Bilder anzeigen, wenn ich dich richtig verstanden habe.
Dann würde ich die Object Eigenschaft der TStringList(Welches von der TListbox verwendet wird) nutzen. In Etwa so:
Code: Alles auswählen
TMyClass = class
Var1, Var2:String;
end;
procedure AddItem(var1, var2:String);
var
ObjectItem:TMyClass;
begin
ObjectItem:=TMyClass.Create;
ListBox1.Items.AddObject(ObjectItem, Var1); // Hier kann die reinfolge der Parameter anders sein.
end;Wenn nicht: Schau dir mal bzw. such mal nach TStringlist.AddObject. Die TListBox verwendet die TStringList intern. Um genau zu sein: TListBox.Items ist die TStringList. Das ist der einfachste Weg, aber ich weiß nicht wie es mit den Speicher verbrauch aussieht. Du möchtest ja verschiedene Bilder anzeigen, wenn ich dich richtig verstanden habe.
MFG
Michael Springwald
Michael Springwald
-
Christian
- Beiträge: 6079
- Registriert: Do 21. Sep 2006, 07:51
- OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
- CPU-Target: AVR,ARM,x86(-64)
- Wohnort: Dessau
- Kontaktdaten:
Re: Viele Panels auf dem Formular = Programm extrem langsam
Das geht so bestimmt nicht var1 muss ein object sein und kein string
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/
-
pluto
- Lazarusforum e. V.
- Beiträge: 7193
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Viele Panels auf dem Formular = Programm extrem langsam
@Christian
Schau dir mal genau den Code an. Du kannst ein Eintrag in einer ListBox mit einer Klasse/Object verbinden. genau so geht das wie ich es gezeigt habe. Du kannst mir auch ruhig mal was glauben. Das ist schon richtig. Ich habe gesehen das ich noch was vergessen habe:
EDIT:
Schau mal meine Playlist Projekt an, müsste hier im Forum geben. Da mache ich es genau so.
http://www.lazarusforum.de/viewtopic.ph ... ste#p14145" onclick="window.open(this.href);return false;
da im Anhang.
Schau dir mal genau den Code an. Du kannst ein Eintrag in einer ListBox mit einer Klasse/Object verbinden. genau so geht das wie ich es gezeigt habe. Du kannst mir auch ruhig mal was glauben. Das ist schon richtig. Ich habe gesehen das ich noch was vergessen habe:
Code: Alles auswählen
procedure AddItem(var1, var2:String);
var
ObjectItem:TMyClass;
begin
ObjectItem:=TMyClass.Create; // DAS OBJECT
ObjectItem.Var1:=Var1;
ObjectItem.Var2:=var2;
// AddObject wird mit einem Objekt aufgerufen und mit einer String Variable. Das ist der Text der angezeigt werden soll. Ich weiß nur nicht mehr die Reihenfolge. Das geht so mit JEDER TStringList.
ListBox1.Items.AddObject(ObjectItem, Var1); // Hier kann die reinfolge der Parameter anders sein.
end;Schau mal meine Playlist Projekt an, müsste hier im Forum geben. Da mache ich es genau so.
http://www.lazarusforum.de/viewtopic.ph ... ste#p14145" onclick="window.open(this.href);return false;
da im Anhang.
MFG
Michael Springwald
Michael Springwald