Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2009, 10:56   #1
alxd
Пользователь
 
Регистрация: 02.07.2009
Сообщений: 77
Радость Ах, что-то с памятью моей стало (Delphi 7)

Строю дерево каталогов в компоненте TreeView. Все отлично, но при выполнении построения память, занимаемая приложением возрастает в 2-3!!! раза. Как с этим бороться, подскажите?

Код:
procedure TfrmSettings.FindBase(Path: String; Parent: TTreeNode);
var
  NewNode: TTreeNode;
  SearchRec:TSearchRec;
  FindRes:Integer;
  FileName: String;
begin
  FindRes := FindFirst(Path + '\*.*', faDirectory, SearchRec);
  while FindRes = 0 do begin
    Application.ProcessMessages;
    if ((SearchRec.Attr and faDirectory) = faDirectory) and ((SearchRec.Name = '.') or (SearchRec.Name = '..')) then begin
      FindRes := FindNext(SearchRec);
      continue;
    end;
    if ((SearchRec.Attr and faDirectory) = faDirectory) then begin
        NewNode := TreeGroup.Items.AddChild(Parent, SearchRec.Name);
        NewNode.ImageIndex := 7;
        NewNode.SelectedIndex := 8;

        FindBase(Path + SearchRec.Name + '\', NewNode);
    end;
    FindRes := FindNext(SearchRec);
  end;
end;
alxd вне форума Ответить с цитированием
Старый 22.09.2009, 11:06   #2
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

А в чем, собственно, проблема? ))) Программа начинает строит дерево, подгружая проц и увеличивает количество записей дерева, выделяя под каждую запись память..
Код:
Application.ProcessMessages;
А вот это советую убрать... Больше дерево - дольше ждете...
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Старый 22.09.2009, 11:22   #3
alxd
Пользователь
 
Регистрация: 02.07.2009
Сообщений: 77
По умолчанию

Цитата:
Сообщение от SuperVisor Посмотреть сообщение
А в чем, собственно, проблема? ))) Программа начинает строит дерево, подгружая проц и увеличивает количество записей дерева, выделяя под каждую запись память..
Просто когда поиск не используется, а просто построится дерево (например восстанавливается из настроек программы), то так память не кушается.

(настройки у меня храняться в текстовом файле и при их чтении дерево строится так же как и при поиске)

Для примера: (<размер занимаемой памяти>)
1) Программа запустилась и восстановила дерево из настроек (5300кб)
2) Программа запустилась и дерево не заполнялось (5100кб)
3) Программа запустилась и дерево не заполнялось при запуске, а заполнялось поиском (18400кб)
alxd вне форума Ответить с цитированием
Старый 22.09.2009, 11:28   #4
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

А если освобождать память, которую компилятор выделяет для
Код:
  NewNode: TTreeNode;
  SearchRec:TSearchRec;
У Вас ведь каждый уровень объявляет эти локальные переменные, а Delphi не очень-то любит за собой убирать, насколько я помню...
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Старый 22.09.2009, 11:31   #5
alxd
Пользователь
 
Регистрация: 02.07.2009
Сообщений: 77
По умолчанию

Цитата:
Сообщение от SuperVisor Посмотреть сообщение
А если освобождать память, которую компилятор выделяет для
Код:
  NewNode: TTreeNode;
  SearchRec:TSearchRec;
.
А как это сделать?
alxd вне форума Ответить с цитированием
Старый 22.09.2009, 11:47   #6
quit
Я есть!
Форумчанин
 
Аватар для quit
 
Регистрация: 17.02.2008
Сообщений: 318
По умолчанию

Цитата:
Сообщение от alxd Посмотреть сообщение
А как это сделать?
Код:
try
FindRes := FindFirst(Path + '\*.*', faDirectory, SearchRec);
  while FindRes = 0 do begin
    Application.ProcessMessages;
    if ((SearchRec.Attr and faDirectory) = faDirectory) and ((SearchRec.Name = '.') or (SearchRec.Name = '..')) then begin
      FindRes := FindNext(SearchRec);
      continue;
    end;
    if ((SearchRec.Attr and faDirectory) = faDirectory) then begin
        NewNode := TreeGroup.Items.AddChild(Parent, SearchRec.Name);
        NewNode.ImageIndex := 7;
        NewNode.SelectedIndex := 8;

        FindBase(Path + SearchRec.Name + '\', NewNode);
    end;
    FindRes := FindNext(SearchRec);
  end;
finally
  FindClose(SearchRec);
end;
©Учиться, учиться и еще раз учиться!
quit вне форума Ответить с цитированием
Старый 22.09.2009, 12:10   #7
alxd
Пользователь
 
Регистрация: 02.07.2009
Сообщений: 77
По умолчанию

Спасибо! Теперь лучше!
alxd вне форума Ответить с цитированием
Старый 22.09.2009, 13:15   #8
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

И ещё желательно:
Код:
freeandnil(newnode);
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На форуме стало меньше светлых голов? Лукманов Александр О форуме и сайтах клуба 3 22.04.2009 20:44
Что будет с выделенной памятью? Sibedir Общие вопросы Delphi 9 18.01.2008 13:57
прокси в моей программе SHEI'TI Работа с сетью в Delphi 1 18.11.2006 19:11