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

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

Потеря памяти при работе с БД [D5, Paradox]


Страницы:   1 2

Tormoz ©   (2004-05-27 13:19:00) 

Уважаемые Мастера!

Пока работал на курсовой работой столкнулся с интересной особенностью:

Программа работает через BDE с БД(Paradox), есть несколько форм, пяток DataModules, ну и прочее:
все компоненты стандартные, родные.
Но вот, блин, незадача: программа оставляет за собой т а к и е "хвосты" в памяти после своего завершения,
что в конечном итоге (если запустить ее несколько раз, например,10), можно почитать следующее сообщение на экране:
"Out of resources" или вообще, на белой простыне от windows: "Системе существенно не хватает ресурсов...".

Что за грабли такие?
Все Datasetы перед завершением программы закрываю, с динамической памятью не работаю,формы, модули данных, и те, создаю и уничтожаю программно...

Но Системный Монитор стабильно показывает уменьшение Свободной физической пямяти.

Посоветуйте, если Кто чего знает, Заранее благодарю за внимание и  помощь!


Tormoz   (2004-06-03 17:25:00) [1]

to All

Спасибо Всем большое, буду пробовать, если чего нарою интересного - обозначу!

Уважаемые! Посоветуйте действительно хорошую литературу по использованию Interbase из под Delphi.


Jiny   (2004-06-03 16:49:00) [2]

Сейчас работаю на корпоративной программой через Interbase Server 6.0. Сервак находится на моем компе, таблиц - около 40, форм - около 120, при работе сразу с несколькими формами тоже возникают проблемы с памятью, приходиться перезагружаться(это в среде разработки), но когда запускаю скомпилинный проект, то смотрю через Мой компьютер->свойства, память жрет на весь проект максимум 10%(это при практически полной загрузке), и после закрытия проги все возвращается обратно как и до запуска.
Помимо освобождения объектов и массивов, нужно в событии OnClose формы писать :
Action:=caFree;
FrmMain:=nil; //где FrmMain - форма, которую закрываешь.
Может поможет :)


NikB   (2004-06-03 12:48:00) [3]

К сожалению я не все написано здесь прочитал :), но советаю пользовать:
MemCheck: the ultimate memory troubles hunter
Created by: Jean Marc Eber & Vincent Mahon, Société Générale, INFI/SGOP/R&D
Version 2.58 -> Also update OutputFileHeader when changing the version #

Contact...
Vincent.Mahon@free.fr
http://v.mahon.free.fr/pro/freeware/memcheck

С нем, когда есть ДебугИнфо, можно легко увидеть сколько и где теряется память. Ест и другие срадства отладки: MemProof i т.д.
Если будут проблемьи с downlod - е-майл мне :)
Желаю удачи


ЮЮ   (2004-06-03 12:15:00) [4]

Поищи в Инете какой нибудь Resource Meter


Sergey13   (2004-06-03 11:42:00) [5]

2Tormoz   (03.06.04 11:11) [20]
В нортоновских утилитах помнится есть прекрасный монитор.


DenK_vrtz   (2004-06-03 11:21:00) [6]

>а как это можно "посмотреть"?

Если 98 винда то открыть, например, Калькулятор\Меню\О программе


Tormoz   (2004-06-03 11:11:00) [7]

To ЮЮ

"Посмотри сколько ресурсов до запуска твоей проги и сколько после".
Извини полного Tormoz'a: а как это можно "посмотреть"?


Sergey13   (2004-06-03 09:13:00) [8]

2ЮЮ ©   (03.06.04 02:52) [18]
Точно.
>Расточительным компонентом в Delphi является DBGrid
А популярный (потому что хороший 8-) DBGridEh (в ранних версиях по крайней мере при работе на В98, щас не знаю, ибо перешел на В2000) уж совсем расточительный. У меня помнится некоторые гриды по 3-4% GDI сжирали. Особенно, помнится, если сильно выеживаться с их титлами (объединения колонок, кнопки и т.п.).


ЮЮ   (2004-06-03 02:52:00) [9]

"Out of resources" =  это, IMHO, нехватка ресурсов (чаще всего GDI в Win95,Win98), а не памяти. Посмотри сколько ресурсов до запуска твоей проги и сколько после. Поэтому их зачастую и не хватает при запуске (ну нету столько!). Расточительным компонентом в Delphi является DBGrid (бросай в Дизайне на форму ДВГриды и наблюдай, как утекают GDI-ресурсы), а их, полагаю, при "пяток DataModules" на формах немерянно. Поэтому методы борьбы лежат несколько не там, не с DataSet-ами "бороться" надо, а экономить ресурсы Windows.


Tormoz   (2004-06-02 09:20:00) [10]

To Кщд ©   (02.06.04 05:43) [16]

Абсолютно согласен, но "этот фрагмент дает меньшие потери памяти после завершения программы...". Бред какой-то.Причем, кажется, мой :(
И еще итересный момент: при завершении программы, аналогичным образом уничтожаю все формы - опять же, потери памяти становятся меньше.


Кщд   (2004-06-02 05:43:00) [11]

1. TDatabase.DataSets
2. при создании в дизайн-тайм, либо при грамотном создании в ран-тайм - об уничтожении позаботится owner. вместо вашей процедуры - посмотрите на 1. и закройте все ассоциированные с ProgDB датасеты.


Tormoz   (2004-06-01 17:59:00) [12]

To Кщд ©   (01.06.04 15:02) [14]

Так можно, если даже датасеты создаются at design time?

 ...

 // Destroy all DataSets
 ProgDB.CloseDataSets; // ProgDB=class(TDataBase);
 ProgDB.Connected:=false;

 K:=0;
 For i:=0 to (Application.ComponentCount-1) Do
 begin
   if ((Application.Components[i] is TDataModule))
   then
     begin
       j:=0;
       While j<=(Application.Components[i] as TDataModule).ComponentCount-1 Do
       begin
         if ((Application.Components[i] as TDataModule).Components[j] is TDataSet)
         then
           begin
            ((Application.Components[i] as TDataModule).Components[j] as TDataSet).Free;
            K:=K+1;
           end
         else j:=j+1;
       end;
     end;
 end;
 showmessage('Was destroyed '+inttostr(k)+' Datasets');


У меня этот фрагмент дает меньшие потери памяти после завершения программы...


Кщд   (2004-06-01 15:02:00) [13]

Tormoz   (01.06.04 13:56) [13]
если создание в ран-тайм, то - код, в котором создаются, + как освобождаете.


Tormoz   (2004-06-01 13:56:00) [14]

To Кщд

"датасеты создаются динамически?" - пусть нет, что тогда ?
"код?" -  какой именно фрагмент?


Кщд   (2004-06-01 13:35:00) [15]

Tormoz
датасеты создаются динамически?
код?


Tormoz   (2004-06-01 13:04:00) [16]

To Digitman

:)))

И все-таки, "Попробуй ,если не сложно, проверить "на память" ..."


Digitman   (2004-05-31 17:49:00) [17]


> Еще я заметил следующее: чем объемнее/сложнее проект, тем
> больше потери.


нет... просто 17-я строка , та самая - с ключевой ошибкой, в более объемном/сложном проекте гораздо менее заметна, нежели в тощем/простом


Tormoz   (2004-05-31 15:24:00) [18]

To Digitman

Хорошо, тогда я вот что предлагаю. В принципе, я добился значительно меньших потерь памяти за счет уничтожения объектов at runtime. Попробуй ,если не сложно, проверить "на память" системным монитором работу какой-нибудь своей BDE-based EXEшник. Может, что-то подобное будет наблюдаться?
Я попробовал посмотреть как работает Winword и прочие брэндовые изделия: этот "товарищ" сколько взял памяти, столько и вернул.
Буду очень признателен, если поделишся результатами.
Еще я заметил следующее: чем объемнее/сложнее проект, тем больше потери.


Digitman   (2004-05-31 13:15:00) [19]

без кода сложно что-либо определенное сказать


Tormoz   (2004-05-31 13:07:00) [20]

Попробовал TaskManager: грабли не показывает.


Страницы:   1 2

Наверх

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