![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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-ом к сожалению никак. Это порок большой программы+глючных виндов.