Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

почему ошибка при загрузке в масив большого числа битмапов?


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?
А может какой-нить альфа-канал присутствует?


Наверх

Титульная страница Поиск, карта сайта Написать письмо