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

Вниз

EOutOfResources - может кто знает как избежать эт ошибку?   Найти похожие ветки 

 
MrAngel ©   (2002-06-02 14:04) [0]

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

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 файла главного проекта.

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

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


 
Song ©   (2002-06-02 14:40) [1]

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


 
MrAngel ©   (2002-06-02 14:45) [2]

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


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

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


 
MrAngel ©   (2002-06-02 15:21) [4]

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


 
Song ©   (2002-06-02 15:44) [5]

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


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

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


 
MrAngel ©   (2002-06-03 09:11) [7]

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


 
MBo ©   (2002-06-03 09:16) [8]

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


 
Anatoly Podgoretsky ©   (2002-06-03 09:52) [9]

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

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

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

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


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

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


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

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

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

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

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

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






 
cyborg ©   (2002-06-03 11:23) [12]

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


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

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


 
MrAngel ©   (2002-06-03 13:29) [14]

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

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


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

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


 
MrAngel ©   (2002-06-03 15:24) [16]

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

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

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


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

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


 
Song ©   (2002-06-03 17:55) [18]

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

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


 
MrAngel ©   (2002-06-03 18:16) [19]

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


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


> MrAngel ©

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



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

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

Наверх




Память: 0.52 MB
Время: 0.011 c
3-39939
Помогите
2002-05-21 10:48
2002.06.13
?


1-40007
SleD
2002-06-03 17:33
2002.06.13
Как реализовать затенение как в XP при выходе


1-40009
Dan__
2002-06-03 18:29
2002.06.13
Вложенная форма без MDI


3-39958
Proton
2002-05-18 09:10
2002.06.13
DB Combo box


4-40199
kvcomp
2002-03-05 16:25
2002.06.13
Как сгенерировать нажатие клавиши?