Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
11-1212932481
Psy
2008-06-08 17:41
2011.06.19
Баг Grush


6-1234896883
Индеец
2009-02-17 21:54
2011.06.19
IdCookieManager не сохраняются куки


15-1298655944
Fergo
2011-02-25 20:45
2011.06.19
Интересный алгоритм в обычном калькуляторе.


2-1299929528
mefodiy
2011-03-12 14:32
2011.06.19
Ввод со сканера штрих-кодов


2-1299862251
Artemgood
2011-03-11 19:50
2011.06.19
Создать Автоматизированный информационный стенд колледжа





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский