AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi speicher wächst und wächst bei TBitmap Appl

speicher wächst und wächst bei TBitmap Appl

Ein Thema von Hoelderlein · begonnen am 21. Jan 2009 · letzter Beitrag vom 23. Jan 2009
Antwort Antwort
Seite 1 von 2  1 2   
Hoelderlein

Registriert seit: 21. Jan 2009
5 Beiträge
 
#1

speicher wächst und wächst bei TBitmap Appl

  Alt 21. Jan 2009, 20:51
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.

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
Programmierlegastemiker aus der Pfalz
http://www.hölderleins-virtuelle-objekte.de
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#2

Re: speicher wächst und wächst bei TBitmap Appl

  Alt 21. Jan 2009, 21:07
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
Frederic Kerber
  Mit Zitat antworten Zitat
Hoelderlein

Registriert seit: 21. Jan 2009
5 Beiträge
 
#3

Re: speicher wächst und wächst bei TBitmap Appl

  Alt 22. Jan 2009, 05:30
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
Programmierlegastemiker aus der Pfalz
http://www.hölderleins-virtuelle-objekte.de
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.989 Beiträge
 
Delphi 12 Athens
 
#4

Re: speicher wächst und wächst bei TBitmap Appl

  Alt 22. Jan 2009, 07:25
Zitat von Hoelderlein:
SUB_Bitmap1 := LoadGraphicsFile(SUB_STR_Pfad_PR_3 + 'PIC_01.JPG');
Nur so 'ne Vermutung: SUB_Bitmap1 ist ein TBitmap? Dann solltest du vor dieser Zuweisung ein SUB_Bitmap1.Free aufrufen (funktioniert übrigens auch, wenn SUB_Bitmap1 = nil ist). Andernfalls wird nämlich das Objekt in SUB_Bitmap1 nicht freigegeben und belegt bis zum Programmende Speicherplatz.
Uwe Raabe
  Mit Zitat antworten Zitat
draeger1980

Registriert seit: 26. Nov 2008
21 Beiträge
 
Delphi 2005 Personal
 
#5

Re: speicher wächst und wächst bei TBitmap Appl

  Alt 22. Jan 2009, 07:30
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: speicher wächst und wächst bei TBitmap Appl

  Alt 22. Jan 2009, 08:10
Also ohne Code wird das hier nichts. Code ist immer besser als tausend Worte.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Hoelderlein

Registriert seit: 21. Jan 2009
5 Beiträge
 
#7

Re: speicher wächst und wächst bei TBitmap Appl

  Alt 22. Jan 2009, 08:21
Danke erstmal für die Antworten.

Zitat:
SUB_Bitmap1 ist ein TBitmap? Dann solltest du vor dieser Zuweisung ein SUB_Bitmap1.Free aufrufen (funktioniert übrigens auch, wenn SUB_Bitmap1 = nil ist). Andernfalls wird nämlich das Objekt in SUB_Bitmap1 nicht freigegeben und belegt bis zum Programmende Speicherplatz.
SUB_Bitmap1 ist ein TBitmap. Ich hab schon probiert SUB_Bitmap1.Free bzw. SUB_Bitmap1.nil bzw. SUB_Bitmap1.avoid(nil) aufzurufen. Bekomme dann eine Fehlermeldung (wenns Prog läuft). Hab die jetzt nicht zur Hand da ich auf Arbeit bin. Werde wohl heute Abend nochmal Posten.

Zitat:
So hat man immernur eine Variable für das TBitmap Objekt.
In einem Pfad liegen 60 Bilder. Diese werden in 60 Variablen geschrieben. Letztendlich hab ich dann nur eine Variable (Bild) die auf dem Schirm angezeigt wird. Der Scrollbar kann im Moment "sehr fleissend" Bewegt werden und die Bilder werden sauber nachgeführt. Würde ich es so machen (wie ich dich verstanden habe) müsste bei jeder Scrollbarpositionsänderung wieder ein Bild geladen werden. Vorteil ich hätte nur eine Belegte Variable. Nachteil läuft nicht rund und sieht dann für den Anwender nicht sauber aus.
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
Programmierlegastemiker aus der Pfalz
http://www.hölderleins-virtuelle-objekte.de
  Mit Zitat antworten Zitat
Hoelderlein

Registriert seit: 21. Jan 2009
5 Beiträge
 
#8

Re: speicher wächst und wächst bei TBitmap Appl

  Alt 22. Jan 2009, 08:23
Zitat:
Also ohne Code wird das hier nichts. Code ist immer besser als tausend Worte.
OK, hast recht. Heute Abend gibt`s Code.

Frank
Programmierlegastemiker aus der Pfalz
http://www.hölderleins-virtuelle-objekte.de
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.989 Beiträge
 
Delphi 12 Athens
 
#9

Re: speicher wächst und wächst bei TBitmap Appl

  Alt 22. Jan 2009, 08:40
SUB_Bitmap1.Free gibt hier keine Fehlermeldung, kann aber auch durch ein
if SUB_Bitmap1 <> nil then SUB_Bitmap1.Free; ersetzt werden.

SUB_Bitmap1.nil ist genauso ungültig wie SUB_Bitmap1.avoid(nil) und sollte schon beim Compilieren angemeckert werden.

Uwe
Uwe Raabe
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: speicher wächst und wächst bei TBitmap Appl

  Alt 22. Jan 2009, 08:57
Nach meiner Erfahrung leaken Funktionen, die eine TBitmap zurückliefern.

Leak:
Delphi-Quellcode:
function DoSomething: TBitmap;
begin
  Result := TBitmap.Create;
  ...
end;
Kein Leak:
Delphi-Quellcode:
procedure DoSomething (var Bitmap: TBitmap);
begin
  Bitmap := TBitmap.Create;
  ...
end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz