Форум: "Начинающим";
Текущий архив: 2011.06.19;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.003 c