![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
почему ошибка при загрузке в масив большого числа битмапов?
delphiForever © (2007-09-04 17:50:00)вот например код
n:=100;
for i:=0 to n do begin
arBm[i]:=TBitMap.Create;
arBm[i].LoadFromFile(IntToStr(i)+'file.bmp');
end;
в результате ошибка "Canvas not allow drawing". Практически n может быть больше или меньше, кажется вроде есть зависимость от железа.
delphiForever (2007-09-04 23:19:00) [1]
> А вот размеры битмапа остались загадкой.
85*120
> Прямо партизан какой то.
ето от дедушки
Anatoly Podgoretsky (2007-09-04 23:15:00) [2]О как подрасло, сразу в 70 раз.
А вот размеры битмапа остались загадкой.
Уже и рисование появилось.
И сколько памяти тратится по диспетчеру задач?
Прямо партизан какой то.
delphiForever (2007-09-04 23:09:00) [3]
> Этот код не откомпилируется, значит это не весь код.
ну вот весь код, прям чудеса, проверил все без ошибок, раньше таким самим способом пытался загрузить картинки для анимации, правда поменьше и в результате получал ошибку примерно один раз с трех
var
Form1: TForm1;
arBm:array of TBitMap;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
SetLength(arBm,0);
for i:=0 to 7050 do begin
SetLength(arBm,Length(arBm)+1);
arBm[i]:=TBitMap.Create;
arBm[i].LoadFromFile('2.bmp');
form1.Caption:=InttoStr(i);
form1.Canvas.Draw(0,0,arBm[i]);
end;
end;
Anatoly Podgoretsky (2007-09-04 21:55:00) [4]> delphiForever (04.09.2007 21:38:14) [14]
Этот код не откомпилируется, значит это не весь код.
delphiForever (2007-09-04 21:38:00) [5]
> 100
100 ето так в переносном смысле, что бы было понятно проблему.
> В Win98 лимит около 300 хэндлов на процесс. В WinXP - около
> 9000 на процесс. А 100 - это мелочь
в принцыпе согласен в Xp работает дольше, у меня:
Win98 цыкл летел где-то на 170 кругу и выше
WinXp где-то около 600-1000
> Скорее всего, что-нить с потоками перемудрил...
потоков вообще нет новый проект, форма и громадная кнопка с кодом:
n:=100;
for i:=0 to n do begin
arBm[i]:=TBitMap.Create;
arBm[i].LoadFromFile(IntToStr(i)+'file.bmp');
end;
Loginov Dmitry (2007-09-04 21:14:00) [6]> Ошибка не здесь
+1
100 - это далеко не лимит для битмаповских хэндлов. В Win98 лимит около 300 хэндлов на процесс. В WinXP - около 9000 на процесс. А 100 - это мелочь. Скорее всего, что-нить с потоками перемудрил...
delphiForever (2007-09-04 19:48:00) [7]
> Anatoly Podgoretsky © (04.09.07 19:44) [11]
> Ошибка не здесь
тогда что?
Anatoly Podgoretsky (2007-09-04 19:44:00) [8]> delphiForever (04.09.2007 17:50:00) [0]
Ошибка не здесь
Инс (2007-09-04 18:36:00) [9]
> delphiForever (04.09.07 17:50)
Вообще, телепаты из отпуска не вернулись еще, но подобная ошибка чаще всего возникает при огромном количестве gdi-объектов, как здесь
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=11868
или возможно вы обращаетесь к VCL из неосновного потока.
delphiForever (2007-09-04 18:25:00) [10]
> Неа, просто в системе существует лимит хендлов.
ну спасиба разрулил тему а то уже год спокойно спать не мог :)
Dib@zol (2007-09-04 18:21:00) [11]Неа, просто в системе существует лимит хендлов.
delphiForever (2007-09-04 18:19:00) [12]
> Памяти не хватает не под сами битмапы, а под их хендлы в
> системе. потому и "доез нот аллов"...
а разве хендл жрет много ресурсов
Dib@zol (2007-09-04 18:15:00) [13]> [3] delphiForever (04.09.07 18:12)
Памяти не хватает не под сами битмапы, а под их хендлы в системе. потому и "доез нот аллов"...
delphiForever (2007-09-04 18:14:00) [14]
> а где рисование в приведенном коде?
рисовать уже не успеваеш...
umbra (2007-09-04 18:12:00) [15]а где рисование в приведенном коде?
delphiForever (2007-09-04 18:12:00) [16]
> В том то и дело, что памяти не хватает
а если загрузить пару файлов большого размер получиться памяти нужно в несколько раз больше чем 100 маленьких файлов, а ошибка не вылетает?
И кажется уже не помню ошибка себя покажет даже если ничего не грузить, а просто в цикле попытаться после создания битмапа изменить его размеры
arBm[i].width:=1;
arBm[i].height:=1;
Dib@zol (2007-09-04 17:57:00) [17]> [0] delphiForever (04.09.07 17:50)
В том то и дело, что памяти не хватает. По крайней мере у меня такое выдавалось лишь по этой причине.
Ega23 (2007-09-04 17:52:00) [18]А это точно bmp?
А может какой-нить альфа-канал присутствует?