Newsgroup: it.comp.lang.delphi
Titolo: Tmemorystream

Ciao a tutti, ho  un applicazione che cataloga delle immagini jpg in righe e
colonne x categorie di immagini a gruppi di circa 40 immagini per volta.
Quando passo da una categoria all'altra la memoria utilizzata cresce sempre
di piů. La memoria utilizzata per giunta aumenta direttamente proporzionale
alla risoluzione grafica del pc ospite. Sapete comč posso riutilizzare lo
spazio allocato di volta in volta? Altrimenti mi esaurisce la memoria in una
ventina di click(con un pc di 512 MB) anche se ricarico lo stesso  gruppo di
immagini. Grazie anticipatamente per la risposta...
Il codice usato per caricare le immagini č il seguente: (ovviamente viene
usato con un ciclo che varia a seconda delle immagini da caricare)
var
s : Tmemorystream;
begin
try
s:=Tmemorystream.Create;
 s.LoadFromFile('files.jpg');
      immagini.CreateThumbnailFromstream('files.jpg');
end;
immagini.Repaint;//componente che cataloga in righe e colonne delle immagini
finally
s.free;
end;

end;
il codice che ci hai postato serve a poco se non ci
posti anche il codice della procedura
CreateThumbnailFromstream('files.jpg') che tra l'altro
si dovrebbe chiamare CreateThumbnailFromFileName per
come e dichiarata.
Ciao MassimoB
---------------------------
http://www.massimobeschi.it/

Potresti spigarmi in che modo disallocare? Comunque chiedo scusa, mi sono
sbagliato a riportare il codice dunque:
var
s : Tmemorystream;
begin
try
s:=Tmemorystream.Create;
 s.LoadFromFile('files.jpg');
      immagini.CreateThumbnailFromstream(s, 'file.jpg');
end;
immagini.Repaint;//componente che cataloga in righe e colonne delle immagini
finally
s.free;
end;
*********************************
 la CreateThumbnailFromstream(s, 'file.jpg'):
procedure TImageLibThumbnails.CreateThumbnailFromStream(Stream : TStream;
ImageNameTag : String);
var
   fStream        : TMemoryStream;
   lFwidth        : Smallint;
   lFHeight       : Smallint;
   lFbitspixel    : Smallint;
   lFplanes       : Smallint;
   lFnumcolors    : Smallint;
   lFiletype      : String;
   lFcompression  : String;
   I              : Integer;
   fim_Width      : LongInt;
   fim_Height     : LongInt;
   FTiffpage      : SmallInt;
   fim_BPP        : SmallInt;
   fim_TiffPages  : SmallInt;
   fim_Compression: String;
   P              : Ph;
   Bitmap         : TBitmap;
   Ratio          : Double;
begin
 fStream :=TMemoryStream.Create;
 try
  fStream.LoadFromStream(Stream);
  if (fStream = nil) or (fStream.Memory = nil) then raise
ErrorInvalid.Create(LoadResString(@iNoStream));
  lFiletype:='';
  fim_TiffPages:=0;
  fStream.Seek(0,0);
  GetBlobInfo (fStream.Memory, fStream.Size, lFiletype, lFwidth, lFHeight,
lFbitspixel, lFplanes, lFnumcolors, lFcompression);
  fStream.Seek(0,0);
  if UpperCase(lFiletype) = 'TIFF' then begin
      try
       GetBlobTiffInfo(fStream.Memory, fStream.Size, 0, fim_Width,
fim_Height, fim_Compression, fim_TiffPages, fim_BPP);
       fStream.Seek(0,0);
      except
      end;
  end;
  for FTiffpage :=0 to fim_TiffPages do begin
    Bitmap:=LoadImageFromStream(fStream, lFiletype, FTiffpage);
    fStream.Seek(0,0);
    If Assigned(Bitmap) then begin
      If Bitmap.Width >=  Bitmap.Height then begin
         Ratio:= Bitmap.Width / (FThumbnailWidth);
         Bitmap:=MakeThumbNailImage(FThumbnailWidth, Round(Bitmap.Height /
Ratio),1, Bitmap)
      end else begin
         Ratio:= Bitmap.Height / (FThumbnailHeight);
         Bitmap:=MakeThumbNailImage(Round(Bitmap.Width /
Ratio),FThumbnailHeight,0, Bitmap)
      end;
      if Assigned (FThumbList) then begin
       New(P);
       P^.Bitmap:=TBitmap.Create;
       P^.Bitmap.Assign(Bitmap);
       P^.Filename:=ImageNameTag;
       P^.Page:=FTiffpage;
       P^.Pages:=fim_TiffPages;
       P^.Filetype:=lFiletype;
       P^.Checked:=False;
       FThumbList.Add(P);
       RowCount:=Ceil(FThumbList.Count / ColCount);
      end;
    end;
  end;
  FCount:=FThumbList.Count;
 finally
  fStream.Free;
 end;
end;

[...]
questa è l'unica allocazione esplicita, con caricamento
di una "grossa quantità" di memoria di cui non vedo
(almeno nel metodo) una disallocazione relativa ( okkio
che l'Assign copia la bitmap! non ne fa un
riferimento), ma ho dato solo un'occhiata veloce.
Poi bisognerebbe vedere come lavorano i metodi (credo
personali o comunque non VCL) GetBlobTiffInfo,
LoadImageFromStream, MakeThumbNailImage.


 Il codice usato per caricare le immagini è il seguente: (ovviamente viene


Potresti spigarmi in che modo disallocare? 
Questi due link potranno aiutarti nel verificare se il tuo programma crea dei
memory leak e dove li crea.
http://www.automatedqa.com/downloads/memproof.asp
http://v.mahon.free.fr/pro/freeware/memcheck/
Ciao!
-- 
Morde. 
(
mo...@despammed.com
)
M-List di icld: 
http://it.groups.yahoo.com/group/icld/