Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.06.13;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.004 c
8-40117
Sting
2002-01-20 19:45
2002.06.13
Дисторшн


3-39972
Руслан Хайбуллин
2002-05-22 09:53
2002.06.13
Сортировка данных в TADOTable


3-39935
kalinka
2002-05-20 11:54
2002.06.13
Ширина листа


1-39986
Ricoshet
2002-05-31 11:51
2002.06.13
Что за глюк в RxTrayIcon?


8-40126
Шурик
2002-01-29 11:14
2002.06.13
Работа со звуком на низком уровне





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский