U okviru svog .exe fajla imam resurse koje u toku rada aplikacije citam i snimam kao fajlove na hard disk. Problem je u tome sto svaki procitani i snimljeni resurs i dalje zauzima prostor u memoriji, dokle god je program aktivan. Evo kako izgleda procedura:
procedure TfrmMain.ResExtract(sName, sFile: string);
var
RS: TResourceStream;
begin
RS := TResourceStream.Create(HInstance, sName, RT_RCDATA);
try
RS.SaveToFile(sFile);
finally
RS.Free;
end;
end;
Sta se desava? Po pokretanju aplikacija u memoriji zauzima (recimo) 5 MB. Kada pozovem datu proceduru za Resurs1 (5 MB), aplikacija u memoriji zauzima 10 MB - u redu, procitan je resurs od 5 MB, snimljen na disk, ali zasto memorija nije oslobodjena? Jos gore, sada kada pozovem datu proceduru za Resurs2 (5 MB), aplikacija u memoriji zauzima 15 MB...? Ovo mi nije jasno. Zasto prethodno zauzeta memorija nije oslobodjena, ili barem prepisana novim pozivom procedure? Ako procitam i na disk snimim 10 razlicitih resursa, moja ce aplikacija u memoriji zauzimati 55 MB :(
Ovaj rast se nastavlja za svaki novi resurs koji se iz aplikacije procita i snimi na disk - svaki ostaje u memoriji aplikacije, iako mi to apsolutno nije potrebno (snimio sam ga na disk, sta ce mi u memoriji, ucitacu ga ako mi bude trebao). Valja napomenuti da pozivom procedure za neki od resursa koji su vec snimljeni ne dolazi do povecanja zauzete memorije (npr. visestrukim pozivom procedure sa parametrom Resurs1 povecava se memorija samo prvi put).
E sad, kad iskomentarisem liniju RS.SaveToFile(sFile); onda nema povecanja memorije (naravno, ni fajl nije snimljen), pa pretpostavljam da je neki problem u SaveToFile() proceduri - ili ne radi kako treba, ili je ja ne koristim kako valja. Ubih se trazeci po netu, ali nisam nasao nista konkretno vezano za problem koji imam.
Pitanje - kako da procitam resurs, snimim ga na disk, i oslobodim memoriju?
Ukoliko je bitno, koristim Delphi 2009.
Hvala unapred.