AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Memory Leck durch Bitmaps?

Memory Leck durch Bitmaps?

Ein Thema von thehed · begonnen am 11. Okt 2003 · letzter Beitrag vom 12. Okt 2003
Antwort Antwort
thehed

Registriert seit: 22. Mär 2003
14 Beiträge
 
Delphi 6 Enterprise
 
#1

Memory Leck durch Bitmaps?

  Alt 11. Okt 2003, 21:15
Hallo
Ich hab da ein Programm geschrieben dass einige Bilder zu einem grossen merged
leider hab ich jetzt festgestellt das bei jedem Durchlauf 256Mb ram verschwinden
Das ist in etwa die grösse die das fertige Bild hat.
Findet hier jemand das Leck? Ich such schon Stunden


Delphi-Quellcode:
zwischenBitmap := TBitmap.Create;
  zwischenBitmap.Width := 200 ;
  zwischenBitmap.Height := 200;
  hauptBitmap := tbitmap.create;
  hauptBitmap.Width := texturmenge*200 ;
  hauptBitmap.Height := texturmenge*200;

   Bitmap := TBitmap.Create;

 // overwrite file if it exists
  ilEnable( il_File_Overwrite );
  // -----------------Bilder laden ------------------------------------
  //progresbar steuerung-------
  progressbar1.max:=texturmenge*texturmenge;
  progressbar1.Position:=0;

  for xi:=0 to (texturmenge-1) do
   begin
    for yi:=0 to (texturmenge-1) do
     begin
   MemDC := CreateCompatibleDC(Canvas.Handle);

  ilGenImages(1, @imgID);
  ilBindImage(imgid);

     // Bild Laden
   xwert:=inttostr(xi);
   ywert:=inttostr(yi);
   namen:=('texture\tx0'+(xwert)+'x0'+(ywert)+'.dds');

 ilLoadImage (pchar(namen));
 progressbar1.position:=progressbar1.Position+1;
 Bitmap := TBitmap.Create;
  Bitmap.Width := ilGetInteger(IL_IMAGE_WIDTH);
  Bitmap.Height :=ilGetInteger(IL_IMAGE_HEIGHT);
 _Bitmap := ilutConvertToHBitmap(Bitmap.Canvas.Handle);

  SelectObject(MemDC, _Bitmap);
  //das ist klar

  BitBlt(Bitmap.Canvas.Handle,(0),(0), Bitmap.Width, Bitmap.Height,
    MemDC, 0,0, SRCCOPY);

   zwischenbitmap.canvas.stretchdraw(rect(0,0,200,200),bitmap);

   BitBlt(hauptbitmap.Canvas.Handle,(xi*200),(yi*200), Bitmap.Width, Bitmap.Height,
   zwischenBitmap.Canvas.Handle,0,0, SRCCOPY);

   ilDeleteImages(1, @ImgId);
    DeleteDC(MemDC);
     DeleteObject(_Bitmap);
      bitmap.Free;


  end;
  end;
  iluDeleteImage(imgID);
  ilDeleteImages(1, @ImgId);
   DeleteObject(_Bitmap);
   DeleteDC(MemDC);

  Image1.Picture.Assign(hauptbitmap);

  bitmap:=tbitmap.create;
   try
    bitmap.Width:= image1.Width;
    bitmap.Height:= image1.Height;
    bitmap.Canvas.CopyMode:= cmSrcCopy;
    bitmap.Canvas.CopyRect(
      Rect(0, 0, bitmap.Width, bitmap.Height), image1.Canvas,
      Rect(0, bitmap.Height - 1, bitmap.Width, -1));
    image1.picture.assign(bitmap);
  finally
   Bitmap.Free;
    end;

  hauptbitmap.free;
  zwischenbitmap.Free;
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Memory Leck durch Bitmaps?

  Alt 11. Okt 2003, 22:50
hauptBitmap.Height := texturmenge*200;

Bitmap := TBitmap.Create;
...
progressbar1.position:=progressbar1.Position+1;
Bitmap := TBitmap.Create;


Du initialisierst Bitmap durch TBitmap.Create. Danach das gleiche nochmal (paar zeilen weiter unten) ohne das vorhergehend initialisierte wieder freizugeben
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Memory Leck durch Bitmaps?

  Alt 11. Okt 2003, 23:47
Moin thehed,

dazu ein kleiner Tip.
Wenn Du Dir angewöhnst immer erst so eine Struktur zu schreiben

Delphi-Quellcode:
ObjektVariable := Klasse.Create;
try
finally
  FreeAndNil(ObjektVariable);
  // oder zumindest
  ObjektVariable.free;
end;
wenn Du ein Objekt erzeugst, kann Dir so etwas nicht so leicht passieren
Gilt natürlich auch für andere Resourcenbelegungen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
thehed

Registriert seit: 22. Mär 2003
14 Beiträge
 
Delphi 6 Enterprise
 
#4

Re: Memory Leck durch Bitmaps?

  Alt 11. Okt 2003, 23:51
Danke fürs durchsehen
Leider besteht das problem trotzdem .
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Memory Leck durch Bitmaps?

  Alt 12. Okt 2003, 00:14
Moin thehead,

hast Du auch schon mal die ganze ilxxx Funktionen einer Prüfung unterzogen?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

Re: Memory Leck durch Bitmaps?

  Alt 12. Okt 2003, 10:06
Hallo,

ich weiß jetzt nicht, wie dein jetziger code aussieht, vielleicht hast du noch ein tBitmap .create ohne free übersehen.

dieses Prog hilft dir dabei : http://www.automatedqa.com/downloads/memproof.asp

Mfg Frank

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
thehed

Registriert seit: 22. Mär 2003
14 Beiträge
 
Delphi 6 Enterprise
 
#7

Re: Memory Leck durch Bitmaps?

  Alt 12. Okt 2003, 11:38
Danke für den Link
Zuerst muss man wohl dieses program verstehgen
bitmaps bleiben immer 2 übrig peek ist 4 das scheint demnach ok zu sein.

Durch probieren schein ich jetzt den fehler eingegrenzt zu haben
hier:
_Bitmap := ilutConvertToHBitmap(Bitmap.Canvas.Handle);

wenn man diesen Befehl nicht ausführt,dann wird der speicher zuletzt
wieder freigegeben.
Möglicherweise fehler in Devil? oder muss man danach etwas beachten?
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

Re: Memory Leck durch Bitmaps?

  Alt 12. Okt 2003, 13:58
lade dir noch die alten Memproof-Versionen runter, bzw die, wo die Hilfe mit dabei ist. Da ist ausführlich erklärt, was du in den Delphi-optionen einstellen mußt (z.b. mit T32-debug-info ... ). Anschließend zeigt dir memproof deinen Source auch mit an und zeigt dir genau, zu welchen create kein free da ist, das betrifft auch weitere Befehle, die Speicher reservieren und hilft dir immens weiter.

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
thehed

Registriert seit: 22. Mär 2003
14 Beiträge
 
Delphi 6 Enterprise
 
#9

Re: Memory Leck durch Bitmaps?

  Alt 12. Okt 2003, 19:42
Zitat von Keldorn:
lade dir noch die alten Memproof-Versionen runter, bzw die, wo die Hilfe .
Ja hab ich gemacht und alles so eingestellt wie in der Anleitung beschrieben.
Alles was ich weis ist gleichviel wie in meinem letzten posting.Es ist definitiv
dieser Befehl irgendwie bleibt da immer ein 1024x1024 rest übrig,bei 64 teilen
gibt das meine 256 -270 mb Ram.
Egal ich machs jetzt anders:
Da zuerst sowiso die ganzen Texturen und anderen Files entpackt werden müssen
(Rfa) um damit eine art Arbeitsumgebung zu erschaffen,konvertiere ich auch noch
gleich die dds Files zu bmp das machts sogar einfacher.Braucht jedenfalls fast
keinen Speicher mehr.
Ich danke für alle Hilfen
  Mit Zitat antworten Zitat
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 12:28 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