![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TObjectList и его размер
SIV5000 © (2011-03-11 15:14:00)Народ привет. Подскажите пожалуйста, столкнулся с такой проблемой: нужно добавить в 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"?
brother (2011-03-16 07:15:00) [1]> Кое-что в качестве информации для размышления:
О_о грабли были рядом, а я их и не заметил ибо всегда делаю так:
bmp:=TBitmap.Create;
bmp.PixelFormat := pf24bit;
прям по лезвию)
_Юрий (2011-03-13 11:44:00) [2]А зачем может вообще понадобиться грузить такое количество битмапов в память одновременно?
Amoeba_ (2011-03-11 22:28:00) [3]Кое-что в качестве информации для размышления:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1429
han_malign (2011-03-11 18:15:00) [4]а вообще - специально для этого Image List есть... и есть у меня такое подозрение, что он и 4Г схавает...
han_malign (2011-03-11 18:08:00) [5]
> количество GDI объектов ограничено кол-вом MAXWORD
- там еще и под объекты - какие то слёзы страничного пула... - то бишь, если DDB - память GDI еще раньше кончится...
han_malign (2011-03-11 18:02:00) [6]не надо забывать в начале(и после использования) отпускать ресурсы
BMP.Dormant
Rouse_ (2011-03-11 17:52:00) [7]Вообще для таких извращений в свое время и был придуман ImageList - отбирая у системы всего лишь 1 GDI хэндл он в реальности представляет из себя банальный BITMAP на котором и хранятся все изображения.
clickmaker (2011-03-11 17:43:00) [8]я бы прислушался к
> [2] Sapersky (11.03.11 15:31)
> Или подумать над тем, стоит ли вообще грузить все 8000 сразу.
Rouse_ (2011-03-11 17:40:00) [9]Вообще-то количество GDI объектов ограничено кол-вом MAXWORD на всю систему (т.е. всего можно создать не больше 65к брашей, битмапов, кистей там) а ты тут сразу махом 8к обьектов забрал у системы. Падает скорее на создании битмапа, а не в TObjectList .
Sapersky (2011-03-11 16:34:00) [10]Проверь Bitmap.HandleType после загрузки, может там DDB создаются. Хотя тогда, скорее всего, вылетело бы ещё раньше.
А с Jpeg-ами - возможно, они грузятся, но не распаковываются, битмапы не создаются.
Anatoly Podgoretsky (2011-03-11 16:31:00) [11]> SIV5000 (11.03.2011 16:25:05) [5]
Так наверно ты добавил только 100000 ссылок
Anatoly Podgoretsky (2011-03-11 16:29:00) [12]> SIV5000 (11.03.2011 16:17:04) [4]
Откуда де достаточно, когда только для голых битмапов над 500 мбайт, а ведь
тут ООП, там обычно в три раз больше надо. Не ты первый кто на этом
споткнулся
Надо переходить на 64 бита ОС и компилятор
SIV5000 (2011-03-11 16:25:00) [13]Только что попробовал с TJpegImage.
Создал, загрузил (по 3,6кб) и добавил в TObjectList 100 000 джипегов, в итоге прога схавала 1,4 гб оператвы и не выбыла.
Так что ж ето такое? Почему бмпешки выбивают прогу а TJpegImage нет, хоть и схавали больше оператвы?????????
SIV5000 (2011-03-11 16:17:00) [14]> В какой строке
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-е.
Что ето за приколы такие, кто знает? Дело не в оператве так как хватает вполне (попробовал снизить свободную оператву по максимуму, так винда начала все на файл подкачки кидать, и результат тот же) и не в картинке (если б была попорченая то выбило б при первой загрузке).
Anatoly Podgoretsky (2011-03-11 15:39:00) [15]> SIV5000 (11.03.2011 15:14:00) [0]
В какой строке
Sapersky (2011-03-11 15:31:00) [16]Вряд ли это ограничение TObjectList.
Попробуй то же самое, но без битмапов, просто выделяя каждый раз по 48 кб памяти. Заработает - значит битмапы "виноваты".
Можно вместо 8000 попробовать 1 большой, с расположением в нём битмапов вертикальной полоской, например.
Или подумать над тем, стоит ли вообще грузить все 8000 сразу.
clickmaker (2011-03-11 15:25:00) [17]> raised exception class EOSError with message 'System Error.
> Code: 87
на какой строчке?