Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.06.19;
Скачать: CL | DM;

Вниз

TObjectList и его размер   Найти похожие ветки 

 
SIV5000   (2011-03-11 15:14) [0]

Народ привет. Подскажите пожалуйста, столкнулся с такой проблемой: нужно добавить в TObjectList много битмапов (больше 8000 штук при том что 1 битмап равен 48кб) но как только в диспетчере задач обем памяти который использует програма достигает где то больше 480 мб то выдает ошибку
(raised exception class EOSError with message "System Error.  Code: 87.
The parameter is incorrect".)
вот приблезительный код:

///
List:TObjectList;

var
I:Integer;
BMP:TBitmap;
begin
for I := 0 to 8000 do begin
 BMP:= TBitmap.Create;
 BMP.LoadFromFile("14.bmp");
 List.Add(BMP);
end;

Вот думаю может ето какоето ограничение в TObjectList-е ведь при чем здесь "The parameter is incorrect"?


 
clickmaker ©   (2011-03-11 15:25) [1]

> raised exception class EOSError with message "System Error.
> Code: 87

на какой строчке?


 
Sapersky   (2011-03-11 15:31) [2]

Вряд ли это ограничение TObjectList.
Попробуй то же самое, но без битмапов, просто выделяя каждый раз по 48 кб памяти. Заработает - значит битмапы "виноваты".
Можно вместо 8000 попробовать 1 большой, с расположением в нём битмапов вертикальной полоской, например.
Или подумать над тем, стоит ли вообще грузить все 8000 сразу.


 
Anatoly Podgoretsky ©   (2011-03-11 15:39) [3]

> SIV5000  (11.03.2011 15:14:00)  [0]

В какой строке


 
SIV5000   (2011-03-11 16:17) [4]

> В какой строке

BMP.LoadFromFile("14.bmp");

Хрен его знает что ето такое, попробовал просто создавать битмап но в TObjectList не додавать, результат тот же самый, но заметил что проделать ето можно лишь
9948 раз если размер битмапа 48кб

for I := 0 to 9947 do begin
BMP:= TBitmap.Create;
BMP.LoadFromFile("14.bmp");

а при размере картинки 666 кб
получилось только 2925 раз и то выдало другую ошибку

(Project Project1.exe raised exception class EInvalidGraphic with message "Bitmap image is not valid".)

Еще попробовал:

BMP:= TBitmap.Create;
BMP.SetSize(128, 128);
Так теперь гдето на 4600-ом выбивает с ошибкой

Project Project1.exe raised exception class EOutOfResources with message "Not enough storage is available to process this command.
".

Немного разьясню зачем все ето надо. Вообще то я работал с TBitmap32. Нужно было дабавить в TObjectList неопределенное количество TBitmap32, но программу так же выбивало только сдругой ошибкой из TBitmap32 и по ходу так как TBitmap32 занимает больше, то получалось добавить не больше 500 штук.
Тогда решил попробовать то же самое на обычном битмапе. И вот результат. Теперь как я понимаю ошибка все-таки не в TObjectList-е.

Что ето за приколы такие, кто знает? Дело не в оператве так как хватает вполне (попробовал снизить свободную оператву по максимуму, так винда начала все на файл подкачки кидать, и результат тот же) и не в картинке (если б была попорченая то выбило б при первой загрузке).


 
SIV5000   (2011-03-11 16:25) [5]

Только что попробовал с TJpegImage.
Создал, загрузил (по 3,6кб) и добавил в TObjectList 100 000 джипегов, в итоге прога схавала 1,4 гб оператвы и не выбыла.
Так что ж ето такое? Почему бмпешки выбивают прогу а TJpegImage нет, хоть и схавали больше оператвы?????????


 
Anatoly Podgoretsky ©   (2011-03-11 16:29) [6]

> SIV5000  (11.03.2011 16:17:04)  [4]

Откуда де достаточно, когда только для голых битмапов над 500 мбайт, а ведь
тут ООП, там обычно в три раз больше надо. Не ты первый кто на этом
споткнулся
Надо переходить на 64 бита ОС и компилятор


 
Anatoly Podgoretsky ©   (2011-03-11 16:31) [7]

> SIV5000  (11.03.2011 16:25:05)  [5]

Так наверно ты добавил только 100000 ссылок


 
Sapersky   (2011-03-11 16:34) [8]

Проверь Bitmap.HandleType после загрузки, может там DDB создаются. Хотя тогда, скорее всего, вылетело бы ещё раньше.
А с Jpeg-ами - возможно, они грузятся, но не распаковываются, битмапы не создаются.


 
Rouse_ ©   (2011-03-11 17:40) [9]

Вообще-то количество GDI объектов ограничено кол-вом MAXWORD на всю систему (т.е. всего можно создать не больше 65к брашей, битмапов, кистей там) а ты тут сразу махом 8к обьектов забрал у системы. Падает скорее на создании битмапа, а не в TObjectList .


 
clickmaker ©   (2011-03-11 17:43) [10]

я бы прислушался к
> [2] Sapersky   (11.03.11 15:31)
> Или подумать над тем, стоит ли вообще грузить все 8000 сразу.


 
Rouse_ ©   (2011-03-11 17:52) [11]

Вообще для таких извращений в свое время и был придуман ImageList - отбирая у системы всего лишь 1 GDI хэндл он в реальности представляет из себя банальный BITMAP на котором и хранятся все изображения.


 
han_malign   (2011-03-11 18:02) [12]

не надо забывать в начале(и после использования) отпускать ресурсы
BMP.Dormant


 
han_malign   (2011-03-11 18:08) [13]


> количество GDI объектов ограничено кол-вом MAXWORD

- там еще и под объекты - какие то слёзы страничного пула... - то бишь, если DDB - память GDI еще раньше кончится...


 
han_malign   (2011-03-11 18:15) [14]

а вообще - специально для этого Image List есть... и есть у меня такое подозрение, что он и 4Г схавает...


 
Amoeba_   (2011-03-11 22:28) [15]

Кое-что в качестве информации для размышления:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1429


 
_Юрий   (2011-03-13 11:44) [16]

А зачем может вообще понадобиться грузить такое количество битмапов в память одновременно?


 
brother ©   (2011-03-16 07:15) [17]

> Кое-что в качестве информации для размышления:

О_о грабли были рядом, а я их и не заметил ибо всегда делаю так:
bmp:=TBitmap.Create;
bmp.PixelFormat := pf24bit;

прям по лезвию)



Страницы: 1 вся ветка

Текущий архив: 2011.06.19;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.009 c
2-1299760300
Cobalt
2011-03-10 15:31
2011.06.19
Передача массива в процедуру


2-1296316880
Пироги
2011-01-29 19:01
2011.06.19
Помогите настроить отображение массива в TListView?


4-1248249215
sektor
2009-07-22 11:53
2011.06.19
Добавление текста в RichEdit


6-1238737207
Alex_C
2009-04-03 09:40
2011.06.19
SendText в блокирующем сокете


3-1260823039
Motzart
2009-12-14 23:37
2011.06.19
Настройка Dataset