Viele Panels auf dem Formular = Programm extrem langsam

Rund um die LCL und andere Komponenten
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

Beitrag von Targion »

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?

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

Beitrag von Euklid »

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

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

Beitrag von Targion »

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. :mrgreen:

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

Beitrag von Christian »

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

Beitrag von Targion »

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.
Dateianhänge
applist.pas
applist.pas des QAppInstall-Tools
(3.2 KiB) 77-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

Beitrag von Hitman »

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.

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

Beitrag von Targion »

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

Beitrag von Hitman »

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.

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

Beitrag von Targion »

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

Beitrag von Socke »

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
MfG Socke
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

Beitrag von pluto »

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

Beitrag von Targion »

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?

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

Beitrag von pluto »

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:

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;
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.
MFG
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

Beitrag von Christian »

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

Beitrag von pluto »

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

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;
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.
MFG
Michael Springwald

Antworten