Viele Kompos zu Laufzeit erstellen
-
Hi, Leute weile endlich mal wieder runter den Programmierern.
Ok, meine Frage:
Ich muss ziehmlich viele Komponenten zur Laufzeit erzeugen so umd die 1000-40000. Darauf sollen noch Labels und Images sein. Das klappt auch einwandfrei, nur mein Problem ist dabei, dass die Speicherauslasung vom Programm erheblich anteigt. Das ist ja auch klar, da das formular auch immer größer wird.
Hier mal mein Beispielcode:
ScrollBox1->Visible=false; for (int i=0;i<20000;i++) { TPanel *Icon = new TPanel (ScrollBox1); Icon->Parent = ScrollBox1; Icon->Top = i*Icon->Height; TImage *IconBild = new TImage(Icon); IconBild->Picture->Icon = Image1->Picture->Icon; IconBild->Parent = Icon; TLabel *Text = new TLabel(Icon); Text->Parent = Icon; Text->Caption = "Icon Nr. "+IntToStr(i); Text->Left = 40; Text->Top = 4; ScrollBox1->Update(); ScrollBox1->Refresh(); Application->ProcessMessages(); Label1->Caption = i; Label1->Refresh(); Label1->Update(); } ScrollBox1->Visible=true;
Der Code ist eigendlich nur dafür, dass man den Geschwindigkeitsunterschied und die Auslasung sehen kann.
Gibt es eine Möglichkeit, die Auslasung so gering wie möglich zu halten?
Ich wollte es Extra nicht über ein Thread laufen lassen, da es ja nur eine while schleife ist, oder wäre ein Thread besser?
-
Threads haben nichts mit der Speicherauslastung zu tun. Wenn du soundsoviel Objekte erzeugst wird eben auch soundsoviel Speicher benötigt.
Wenn du den Speicherbedarf reduzieren willst musst du also die Zahl der (gleichzeitg vorhandenen) Objekte reduzieren, z.B. indem du nur Objekte für den jeweils sichtbaren Ausschnitt erzeugst.
-
Das hatte ich mir zuerst auf überlegt, aber das geht leider in meiner Situation nicht. Ich hätte jetzt gedacht, dass man irgendwie die Speicherauslasung schonen kann indem man zB der Komponenten eine Priorität zuweist oder, so aber anscheind geht das ja net.
-
Komponenten prioritäten zuweisen? Wozu das denn? Was für prioritäten bitte? Was soll die Priorität mit dem SPeichermanagement zu tun haben? Wieso geht Jansens vorschlag nicht?
-junix
-
junix schrieb:
Komponenten prioritäten zuweisen? Wozu das denn? Was für prioritäten bitte? Was soll die Priorität mit dem Speichermanagement zu tun haben?
Natürlich nichts, sie sind aber nicht so CPU belastend.
junix schrieb:
Wieso geht Jansens vorschlag nicht?
-junixStimmt, "gehen" bzw "geht" ist immer relativ. Es ist halt ziehmlich schwierig.
Hier mein Projekt:
Ich will eine neue Art von TDIconSuch rausbringen (Freeware), bei TDIconSuch habe ich die Icons immer per TListView angezeigt. Das ist mir aber zu unprofessionell. Desswegen will ich auf eine eigene Komponente umsteigen, die so ähnliche Funktionen wie TListView hat, nur wesendlich angepasster ist. Es soll bei den Icons bspw. Das Icon angezeigt werde, der Dateiname, die anzahl der Icons, größe, blablabla... Icon müsste mir doch eine paralelle komponente anlegen(zB Stringlist), die die ganzen Dateien mit den Icons enthält und dann per scrolllist berechnen, wieviele panels angezeigt werden, wieviele beim scrollen gescrollt werden sollen. Oder hast du ne bessere Idee?
-
Tillmann David schrieb:
junix schrieb:
Komponenten prioritäten zuweisen? Wozu das denn? Was für prioritäten bitte? Was soll die Priorität mit dem Speichermanagement zu tun haben?
Natürlich nichts, sie sind aber nicht so CPU belastend.
Ja was denn jetzt? Ich dachte wir reden hier von Speicherauslastung? Entscheide dich bitte.
Tillmann David schrieb:
junix schrieb:
Wieso geht Jansens vorschlag nicht?
Stimmt, "gehen" bzw "geht" ist immer relativ. Es ist halt ziehmlich schwierig.[...projektbeschrieb...]
Ich schnall nicht ganz wie du dir das vorstelllst? Naja wie dem auch sei, du weisst ja, wieviel Platz du zum anzeigen hast. Daraus kannst du ja errechnen wieviel du schon verbraucht hast. Irgendwo im Hintergrund hast du z.B. n Dokument welches alle Icons, Files, etc. enthält. daraus forderst du dann soviele Icons und Files an wie du brauchst und stellst diese dar. Beim Scrollvorgang löschst du alles wieder und berechnest den Fensterausschnitt neu.
-junix
-
Ja, genau das meinte ich auch. Hier kannste schon sehen wie ich angefangen hab, dass prob ist halt nur das beschriebene Maximum Dings da. Trotz der Suchfunktion hab ich kein Ergebnis gefunden, zumindest keins, was mir dabei weiterhilft
-
meine Antwort darauf steht im von dir verlinkten Thread...