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

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

EOutOfResources - может кто знает как избежать эт ошибку?


MrAngel ©   (2002-06-02 14:04:00) 

Ребятя короче проэкт стоит не могу от этой ошибки избавиться...
Про блема вот в чём:
Я создаю битовые карты в памяти (массив указателей на битовые карты).
Код примерно выглядет так:

var BMP_MAS:Array [0..1000-1] of TBitmap;
i:integer;
begin
for i:=0 to 1000-1 do
begin
BMP_MAS[i]:=TBitmap.Create;
BMP_MAS[i].Width:=100;
BMP_MAS[i].Height:=100;
BMP_MAS[i].... :=24Bit;
end;
end;


Примерно на i=400 вылетает ета ошибка типа не могу больше выделить системных ресурсов. На сколько я помню виртуальный режим позволяет выделять до 4Gb адресного пространства каждой программе.
Давайте подщитаем:
1. Количество байт для каждой картинки - 100*100*24=240000
2. Количество байт для 1000 картинок 240000000=288Mb

У меня на диске сейчас 4Gb свободного места. Причём для свап файла выделено не менее 400Mb. Ни какой больше программы у меня кроме Дельфи не запущено => моеё программе теоретически должно быть выделено 288Mb.

Кстати при работе вообще с памятью такаяже ошибка (это функции типа SetLength GetMem AllocMem и др.)

Когда то давно я ещё программируя на паскале использовал {$M }
Теперь эта директива находится в .cfg файла главного проекта.

Короче крыша едет... может кто с этим уже сталкивался то подскажите пожалуйста...

Повторю ещё раз вопрос как мне выделить вольше ресурсов дабы избежать эту ошибку?


Набережных С.   (2002-06-03 20:29:00) [1]


> MrAngel ©

По всей вероятности, тебе не хватает размера стека.


MrAngel   (2002-06-03 18:16:00) [2]

Хорошо тогда что эти числа обозначают?


Song   (2002-06-03 17:55:00) [3]

$M дальше три числа через запятую

(сразу скажу не поможет)


MrAngel   (2002-06-03 17:52:00) [4]

Ребята может кто нибудь знает как $M использовать?


MrAngel   (2002-06-03 15:24:00) [5]

Хорошо а если взглянуть с другой стороны что такое системные ресурсы? - Ето память которая выделяется системой для приложения? Тогда по идее система должна выделить по возможности столько сколько потребует программа (вспомните игры).

Ваще странная это вещь.

Хорошо а может кто работал с диррективой $M ? Может кто знает как ею пользоваться и в каких случаях она работает и вообще на что она влияет? (Может всё таки дело в компиляции программы?)


Виктор   (2002-06-03 14:00:00) [6]

Похоже, дело не в цикле. Иначе эффект был бы стабилен. Похоже, копать надо глубже, в потоках. Я бы сделал так. Раз подозрение на цикл, то уменьшил бы кол-во циклов до минимума, чтобы программа заработала, затем увеличивал бы кол-во циклов, пока программа не перестанет работать. Затем надо начать эксперименты на пограничном числе. Поставить ловушки на рекурсивные вызовы процедур и т.п. Надо заставить систему выдавать стабильную ошибку в одном и том же месте, или, если не получается, то заставить ее выдавать разные сообщения.


MrAngel   (2002-06-03 13:29:00) [7]

cyborg © - я так и делаю... у меня ведь массив типа TBitmap. По сути дела там и находятся указатели на етот обьект. А на счёт хандлов может ты и прав. Когда попробую напишу сюда результат.

Виктор © (03.06.02 11:52) - C TButton не пробовал но делал с TMemoryStream.LoadFromFile - и вылетала таже самая ошибка. Вылетает при разных i - и без разницы где запущена в IDE или просто так. Application.ProcessMessages не использую у меня поток.


Виктор   (2002-06-03 11:52:00) [8]

я так и не понял - вылетает при одном и том же значении i или при разных, если запускать из ide и без. Попробуй заменить TBitMap на TButton. Как изменится результат? Меняй условия эксперимента и следи за реакцией системы. Handlы сидят только в оперативке. Чем больше озу, тем больше окон можно одновременно открывать. Вставь в цикл Application.ProcessMessages, чтобы приложению было легче дышать.


cyborg   (2002-06-03 11:23:00) [9]

Системные ресурсы это не оперативная память, а видимо память, где хранятся всякие хандлы и прочее, ты пытаешься создать 1000 картинок, тут никаких ресурсов не хватит :-), я так думаю.
Попробуй создавать не битмапы, а сделай массив поинтеров, выделяй память, размещай туда свои картинки, потом , когда нужно, читай по указателям.


MrAngel   (2002-06-03 11:18:00) [10]

Так ребята признаю ошибку в расчётах. Но факт что EOutOfResources вылетает.

vuk © (03.06.02 11:08) - Может быть и так но как тогда обьяснить такое что при выполнении проседур SetLength GetMem AllocMem и др. тоже вылетает EOutOfResources???

Anatoly Podgoretsky © (03.06.02 09:52) - спасибо за исправление - тогда выходит что система не может мне выделить 9Мб памяти... ерунда какая - то.

Поймите я опустил одну деталь - я не сказал что ошибка вылетает при работе с TMemoryStream... поэтому вряд ли ето нехватка GDI ресурсов.

Может ещё кто нибудь подскажет в чём дело ?





vuk   (2002-06-03 11:08:00) [11]

скорее всего имеет место обычное исчерпание ресурсов GDI. Дело не в объеме памяти, занимаемой изображениями, а в количестве самих изображений. Выход здесь один - каким-то образом оптимизировать работу с изображениями.


Anatoly Podgoretsky   (2002-06-03 09:52:00) [12]

MrAngel © (02.06.02 14:04)
...
Давайте подщитаем:
1. Количество байт для каждой картинки - 100*100*24=240000

Давайте еще раз подсчитаем:

1. Количество байт для каждой картинки - 100*100*3=30000
2. Количество байт для 1000 картинок 40000000=9.6 Mb

Так что дело наверно не в этом, а наверно в ОС


MBo   (2002-06-03 09:16:00) [13]

А их нужно все одновременно держать в памяти?
кстати, объем одной 100*100*3=30 kB


MrAngel   (2002-06-03 09:11:00) [14]

Ребята неужели ни кто не сталкивался с такой проблемой ?


MrAngel   (2002-06-02 15:47:00) [15]

А ясно... нет я короче и в XP и в 98 запускал прогу всёравно одна и таже ошибка...
По моему это надо что то на этапе компиляции делать.


Song   (2002-06-02 15:44:00) [16]

w2k - Это Windows 2000 Также хорошо работают с памятью XP и NT


MrAngel   (2002-06-02 15:21:00) [17]

Так у меня 128Mb ... да в обоих случаях вылетает ошибка...


Виктор   (2002-06-02 15:07:00) [18]

сколько оперативной памяти? Если запускать программу в отладчике и без отладчика - ошибка возникает при одном и том же i?


MrAngel   (2002-06-02 14:45:00) [19]

Не совсем в курсе что такое w2k.
А есть ли какой нибуть другой способ или какие дибуть идеи или предположения?


Song   (2002-06-02 14:40:00) [20]

Запускать на w2k. На 98-ом к сожалению никак. Это порок большой программы+глючных виндов.


Наверх

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