Potrzebując do programu dużych ilości pamięci napisałem taką oto procedurę, który alokuje potrzebną ilość:
var
dane: array of byte;
value: cardinal;
begin
value:= 104857600; //100MB
try
setlength(dane,value);
except
end;
end;
Siedząc na sprzęcie z 512MB pamięci fizycznej i 768MB pamięci stronicowanej (win XP) z aktualnym zużyciem pamięci około 300MB zmieniałem wartość zmiennej value zaczynając od ok 1mld bajtów (prawie 1GB). Po skompilowaniu i włączeniu program albo przestawał odpowiadać, a wg Menedżera zadań Windows program otrzymywał od 120MB do 300MB pamięci w kilku próbach. Dodałem do kodu showmessage, żeby sprawdzić czy zawiesza się po wykonaniu try...except czy dopiero po zakończeniu procedury (ponieważ value jest zmienną lokalną):
try
setlength(dane,value);
showmessage('udało się');
except
showmessage('nie udało się');
Program nie dochodził nigdy do showmessage, zamiast tego zawsze w pewnym momencie alokowania pamięci się zawieszał.
Po zmniejszeniu value do 100MB program działał bez problemów, również na 300MB nic nie wychodziło źle, jednak już przy 600MB powtórzyło się to samo co przy 1GB. Niestety nie wiem dlaczego się tak dzieje ani co można zrobić, żeby program w przypadku braku możliwości zalokowania potrzebnych ilości pamięci, zamiast się zawieszać, przekazywał o tym informację użytkownikowi.
Jakby ktoś mógł mi w tym pomóc, byłbym bardzo wdzięczny.
adakasty