@Milan Milosevic
>Nisam bas citao detaljno ali mozda ovo moze da ti pomogne
To vraca velicinu WorkingSet-a procesa, tj. koliko rama je ukupno "otkinuto" od sistema, realna upotreba memorije je uvek daleko manja (mada svakako korisna informacija, jer upravo je to u krajnjoj liniji bitno

)
@Rapajic Rajko
>Ukoliko nemas jedinstvenog/root ancestora, mozes da napravis Delphi interface sa metodom GetOwnMem, koji ces pridruziti svim tvojim klasama
Jos laksi i prljaviji nacin je koriscenje class helpera, jednostavno dopunis TObject i ne moras da izvodis svoje klase. Koriscenjem interfejsa bi morao da nasledi i dopuni svaku klasu ponaosob, a i to ne bi pomoglo ako klase imaju podklase, jer njihov kod pretpostavljam ne moze da menja. Class helperi naravno rade od D10 nagore.
Znaci kao sto sam napisao na pocetku, bez custom MM-a ces tesko postici to sto zelis. U tom cilju sam napisao jedan

Ovaj MM sabira ukupnu kolicinu alocirane memorije svih Delphi objekata (znaci i AllocMem i TObject.Create). Obavezno stavi MyMM kao prvi uses unit u dpr fajlu. Kolicniu zauzete memorije u svakom trenutku mozes da proveris sa MyMM.TotalSize. Samo pazi, MyMM prati samo Delphi memoriju, znaci egzotike tipa Ole objekti i WinAPI funkcije koje same alociraju ram otpadaju, ali to ti ni ne treba ako sam te dobro razumeo, svi tvoji objekti su 100% Delphi kod.
Code:
unit MyMM;
interface
function MyAlloc(Size: Integer): Pointer;
function MyFree(P: Pointer): Integer;
function MyRealloc(P: Pointer; Size: Integer): Pointer;
const MyMemMgr: TMemoryManager = (GetMem: MyAlloc; FreeMem: MyFree; ReallocMem: MyRealloc);
var
TotalSize: Integer = 0;
OldMM: TMemoryManager;
implementation
uses
Windows, SysUtils;
function MyAlloc(Size: Integer): Pointer;
begin
Result := OldMM.GetMem(Size);
InterlockedExchangeAdd(TotalSize, Size);
end;
function MyFree(P: Pointer): Integer;
var
Size: Integer;
begin
Size := SizeOf(P);
Result := OldMM.FreeMem(P);
InterlockedExchangeAdd(TotalSize, -Size);
end;
function MyRealloc(P: Pointer; Size: Integer): Pointer;
var
OldSize: Integer;
begin
OldSize := SizeOf(P);
Result := OldMM.ReallocMem(P, Size);
InterlockedExchangeAdd(TotalSize, -OldSize);
InterlockedExchangeAdd(TotalSize, Size);
end;
initialization
GetMemoryManager(OldMM);
SetMemoryManager(MyMemMgr);
end.
MyMM.TotalSize je obican var integer, znaci mozes i direktno da mu menjas vrednost, npr. postavis MyMM.TotalSize na nulu kad hoces i onda pratis kako se menja.
Edit: Popravio Inc i Dec pozive na InterlockedExchangeAdd
[Ovu poruku je menjao Boris B. dana 10.03.2009. u 19:30 GMT+1]
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.