![]() |
speicher wächst und wächst bei TBitmap Appl
Hallo erstmal,
bin neu hier, hab kein Platz zum vorstellen gefunden also Hallo an alle. Vorab, bin kein Programmierprofi in Delphi, komm ganz gut zurecht mach aber scheinbar ab und zu noch drastische Fehler. Von Haus aus programmier ich eher SPS und industrielle Kamerasysteme. Nun zum Thema: Hab vor 1,5 Jahren ein Projekt in Delphi ohne Vorkenntnisse angefangen. Hab jetzt ein Programm bei dem ich 60 Fotos von einem sich drehendem Objekt mache. Diese in meine Software integriere und per scrollbar das Objekt in 60 Schritten um die eigene Achse drehen lassen kann. Ich kann bis zu 30 Objekte in die Software einbinden. Hab in der Signatur die Add. zur UNKOMMERZIELLEN Homepage Also viel viel Bilder in JPG. Hatte eigentlich gedacht ich bin zu 99% fertig. Jetzt stell ich fest das ich ein riesen Speicherproblem hab. Hab mich mal mittels suche schlau gemacht und gelernt das es z.B. free gibt und z.B. das lokale Variablen keinen Speicherplatz mehr beanspruchen wenn z.B. die Prozedur beendet wird. Hätt ich mich besser mal vorher schlau gemacht. Hab also ein TImage in dem Angezeigt wird und je nach Schiebereglerstand 60 Verschiedene Fotos. Alle diese Fotos liegen in 60 getrennten globalen Variablen (z.B. BM1 bis BM60) und werden in verschiedenen Proceduren verwendet. Ich lade also z.B. in der Proc >> Objekt_Laden << Das Bild in die Globale variable (Hier 1 von 60) SUB_Bitmap1 := LoadGraphicsFile(SUB_STR_Pfad_PR_3 + 'PIC_01.JPG'); In einer anderen Procedur wird je nach Scrollbarstand das dementsprechende Bild weggeschrieben if (SUB_ScrollBar.Position = 1) Then // Bild 1 BEGIN SUB_Bitmap1 := LoadGraphicsFile(SUB_STR_Pfad_PR_ZOOM +'PIC_01.JPG'); SUB_Bitmap := SUB_Bitmap1; END; Dann hab ich zu aller verwirrung noch die Möglichkeit in einer anderen Procedur das Objekt in drei verschiedenen auflösungen zu laden. Muß sagen fuktioniert alles wunderbar bis auf mein Speicherproblem. :wall: Gibt`s noch Hoffnung auf eine "kleine Programmanpassung" ???? Ich denke eines meiner Hauptprobleme ist das ich mich dafür entschieden hatte die Bilder in globale Variablen zu schreiben. Da ich gelesen habe nach ende der Procedur wird Speicher wieder frei gemacht. Gruß erstmal |
Re: speicher wächst und wächst bei TBitmap Appl
Hallo!
Herzlich willkommen in der DP! Was genau ist denn dein Speicherproblem? Vllt. kannst du uns auch etwas mehr Code zeigen? (Ich sah jetzt bspw. die Verwendung der globalen Variablen) Ciao, Frederic |
Re: speicher wächst und wächst bei TBitmap Appl
Hallo,
kann gerne noch etwas Code einfügen, ist aber denk ich sinnvoll wenn ich erst nochmal detailierter das Problem schildere. - Ich hab also 60 Bilder auf festplatte (pro Objekt 60 * 4 Auflösungen * 10 Objekte = 2400 Bilder) - Je nachdem welches Objekt mit welcher Auflösung geladen wird lade ich die dementsprechenden 60 Bilder in die 60 glob. Var. - Danach kann das Objekt gedreht werden (mit Schieberegler in einer anderen Procedur) - In der "Schiebereglerprocedur" wird einfach je nach Stand das dementsprechende Bild in das Timage geladen - Das Ändern der Auflösung (gering - mittel - hoch) geschieht auch in einer eigenen Procedur - Beim Zoomen wird die höchste Auflösung geladen (nur ein Bild auf dem der scrollbar gerade steht) Das ist so vom Prinzip her die "Grundfunktion" des Programms und funktioniert alles wunderbar. Jetzt das Problem : Jedesmal wenn Bilder vom Datenträger in die 60 Globalen Variablen mit den Bildern geladen werden wird Arbeitsspeicher "verschwendet". Also der belegte Speicherplatz steigt mit jedem mal wo ich Objekte öffne betätige oder die Auflösung der Bilder ändere. Ich hab nicht einen Befehl drin der den Speicherplatz wieder freigibt. Dies würde ich gerne machen bevor ich wieder Bilder vom Datenträger in die Variablen lade. Dies ist genau der Zeitpunkt bei der er die Variablen vom Speicherplatz her gesehen überschreiben bzw. erst freigeben und dann wieder belegen könnte. Dann währe das Speicherproblem beseitigt. also kurz vor hier --> SUB_Bitmap1 := LoadGraphicsFile(SUB_STR_Pfad_PR_3 + 'PIC_01.JPG'); Ich hab mit NIL bzw. FREE rumprobiert und keinen Erfolg gehabt. Ich überleg mir mal wie ich ev. mehr Source hier reinkrieg und es aber noch übersichtlich bleibt. Ist viel Text im Programm ;o) Gruß Frank :cheer: |
Re: speicher wächst und wächst bei TBitmap Appl
Zitat:
|
Re: speicher wächst und wächst bei TBitmap Appl
Hallo,
mein Lösungsvorschlag wäre, die Dateipfade in eine TStringlist zu laden und über den ItemIndex kann mann ja in Verbindung mit der Scrollbar.position eine eindeutige Zuordnung schaffen. So hat man immernur eine Variable für das TBitmap Objekt. |
Re: speicher wächst und wächst bei TBitmap Appl
Also ohne Code wird das hier nichts. Code ist immer besser als tausend Worte.
|
Re: speicher wächst und wächst bei TBitmap Appl
Danke erstmal für die Antworten.
Zitat:
Zitat:
Ursprünglich hatte ich mal diese Variante, hab dann aber auf die jetzige umgetippt. Wenns Sauber fluffig laufen soll brauch ich doch die 60 Bildern in irgend einer Form als Variable oder ?? Gruß Frank |
Re: speicher wächst und wächst bei TBitmap Appl
Zitat:
Frank |
Re: speicher wächst und wächst bei TBitmap Appl
SUB_Bitmap1.Free gibt hier keine Fehlermeldung, kann aber auch durch ein
Delphi-Quellcode:
ersetzt werden.
if SUB_Bitmap1 <> nil then SUB_Bitmap1.Free;
SUB_Bitmap1.nil ist genauso ungültig wie SUB_Bitmap1.avoid(nil) und sollte schon beim Compilieren angemeckert werden. Uwe |
Re: speicher wächst und wächst bei TBitmap Appl
Nach meiner Erfahrung leaken Funktionen, die eine TBitmap zurückliefern.
Leak:
Delphi-Quellcode:
Kein Leak:
function DoSomething: TBitmap;
begin Result := TBitmap.Create; ... end;
Delphi-Quellcode:
procedure DoSomething (var Bitmap: TBitmap);
begin Bitmap := TBitmap.Create; ... end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz