imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 08.05.2005, 17:34     # 1
Sam Dark
Member
 
Аватар для Sam Dark
 
Регистрация: 03.07.2003
Адрес: Voronezh, Russia
Пол: Male
Сообщения: 294

Sam Dark МолодецSam Dark МолодецSam Dark Молодец
Question Delphi. Программа постепенно сжирает всю память.

Программа работает с MSSQL через BDE. Используются TDataBase, TQuery.

Подозреваю вот эту процедурку(выполняется неоднократно):

Код:
procedure TMainForm.GetShortcuts;
var
  i:integer;
begin
  //Чистим иконки
  ShortcutIcons.Clear;
  //Получаем установленные ярлычки
  Query.Close;
  Query.SQL.Clear;
  Query.SQL.Add('SELECT a.AppName, a.AppDescription, ca.AppPath FROM T_Clients_Apps as ca, T_Applications as a WHERE ((ca.App_ID=a.App_ID) AND (ca.ClientNumber='+IntToStr(CompNum)+')) order by a.AppName');
  //Пихаем в массив
  Query.Open;
  SetLength(Shortcuts,0);
  i:=0;
  Query.First;
  while (not Query.Eof) do
  begin
    SetLength(Shortcuts, Length(Shortcuts)+1);
    Shortcuts[i].Name:=Query.FieldByName('AppName').AsString;
    Shortcuts[i].Path:=Query.FieldByName('AppPath').AsString;
    Shortcuts[i].Description:=Query.FieldByName('AppDescription').AsString;
    inc(i);
    Query.Next;
  end;
  //Перерисовываем
  for i:=0 to High(Shortcuts) do
  begin
    GetIcon(Shortcuts[i].Path, 0, ShortcutIcons);
    VShortcuts.AddItem(Shortcuts[i].Name,nil);
    VShortcuts.Items[VShortcuts.Items.Count-1].ImageIndex:=i;
  end;
  VShortcuts.Refresh;
end;
VShortcuts - TListView.
Shortcuts - TShortcuts.
ShortcutIcons - TImageList.

Код:
TPrice = array of record
    TimeStart, TimeEnd: TDateTime;
    Price30, Price60, Price90, Price120, PriceInf: Real;
  end;

  TShortcuts = array of record
    ID : Integer;
    Name: string;
    Path: string;
    Description: string;
    Comp: integer;
    Price: TPrice;
  end;
Если кто знает в чём причина и как бороться - помогите.
Спасибо.
__________________
Это жжжж неспроста...
Sam Dark вне форума  
Старый 09.05.2005, 19:02     # 2
/7y3uK
Advanced Member
 
Аватар для /7y3uK
 
Регистрация: 09.03.2004
Адрес: толстозадая Москва
Сообщения: 498

/7y3uK Реально крут(а)/7y3uK Реально крут(а)/7y3uK Реально крут(а)/7y3uK Реально крут(а)
а какие симптомы у больного?
....
edited:
пардон... не заметил, по поводу массива... ну ессесно он будет у тебя жрать памяти... тыж в динамический массив засовываешь стринги из запроса... а там небось записей тыщ 10... а если не 10к, то на каждый вызов процедуры ты реалок памяти для массива делаешь, так что если записей мало, но процедура вызывается очень часто, то это вот как раз и есть Можно по советовать сделать массив не динамический а статический с каким-нить заранее известным и большим размером - он хоть и будет память жрать, зато не будет так систему напрягать постоянными реалоками...

а зачем ты еще раз запихиваешь данные из запроса в массив?
если уж приперло именно в массив писать - можно поступить вот так:
Код:
PShortcut = ^TShortcuts;
TShortcuts = record
    ID : Integer;
    Name: string;
    Path: string;
    Description: string;
    Comp: integer;
    Price: TPrice;
end;

и хранить только указатели...
чтото типа 

var
p: PShortcut;
list : TList;

...
в процессе итерирования
p := new (PShortcut);
заполняем поля...
list.add(p);

а итерироваться лучше вот так

while (Query.FindNext)
  begin
    ....
    тут мы уже стоим на следующей строке и можем прямо сразу брать нужное и запыхивать куда нада... массив тут не нужен ИМХО
  end;
__________________
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах

Последний раз редактировалось /7y3uK; 10.05.2005 в 01:12.
/7y3uK вне форума  
Старый 09.05.2005, 21:06     # 3
blink
Member
 
Аватар для blink
 
Регистрация: 23.02.2004
Адрес: http://twitterceleb.com/
Сообщения: 213

blink Путь к славе только начался
С Delphi к сожалению не знаком, но очень похоже на memory leaks.
__________________
twitterceleb.com
blink вне форума  
Старый 10.05.2005, 10:43     # 4
dyr_farot
Advanced Member
 
Регистрация: 23.08.2003
Сообщения: 442

dyr_farot Нимб уже пробиваетсяdyr_farot Нимб уже пробивается
это они и есть. но в приведенной процедуре ничего такого не видно...
Sam Dark, обрати внимание на куски кода, в которых есть Create
dyr_farot вне форума  
Старый 10.05.2005, 21:13     # 5
Sam Dark
Member
 
Аватар для Sam Dark
 
Регистрация: 03.07.2003
Адрес: Voronezh, Russia
Пол: Male
Сообщения: 294

Sam Dark МолодецSam Dark МолодецSam Dark Молодец
Вот и первые проблемы. Delphi упал. Что-то я начал сомневаться, что это из за массивов (судя по тексту ошибки).
Изображения
Тип файла: jpg error.jpg (39.8 Кбайт, 21 просмотров - Кто скачивал? )
__________________
Это жжжж неспроста...
Sam Dark вне форума  
Старый 10.05.2005, 21:27     # 6
Al-x
Junior Member
 
Регистрация: 30.03.2003
Адрес: СПб
Сообщения: 162

Al-x МолодецAl-x МолодецAl-x Молодец
В ошибке как раз и говорится, что недостаточно памяти. Её и массив может заср...ть.
Цитата:
dyr_farot:
обрати внимание на куски кода, в которых есть Create
и ещё посмотри на все new/dispose (всё что создаёшь должно уничтожаться).
А по поводу массива - /7y3uK тему говорит, только не забывай dispose элементам списка делать.
__________________
640Kbytes should be enough for everything! (c) Bill Gates, 1981.
Все "спасибо" в репутацию
Al-x вне форума  
Старый 11.05.2005, 10:38     # 7
Sam Dark
Member
 
Аватар для Sam Dark
 
Регистрация: 03.07.2003
Адрес: Voronezh, Russia
Пол: Male
Сообщения: 294

Sam Dark МолодецSam Dark МолодецSam Dark Молодец
Al-x
В том то и дело, что create-ов почти нет. Может ли BDE пакостить?
__________________
Это жжжж неспроста...
Sam Dark вне форума  
Старый 11.05.2005, 11:32     # 8
/7y3uK
Advanced Member
 
Аватар для /7y3uK
 
Регистрация: 09.03.2004
Адрес: толстозадая Москва
Сообщения: 498

/7y3uK Реально крут(а)/7y3uK Реально крут(а)/7y3uK Реально крут(а)/7y3uK Реально крут(а)

повторяю - тебе массив твой пакостит - тут вполне можно без него обходиться...
BDE тут не при чем... не веришь - попробуй тоже самое, но через ADO сделать...
__________________
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
/7y3uK вне форума  
Старый 12.05.2005, 12:07     # 9
Sam Dark
Member
 
Аватар для Sam Dark
 
Регистрация: 03.07.2003
Адрес: Voronezh, Russia
Пол: Male
Сообщения: 294

Sam Dark МолодецSam Dark МолодецSam Dark Молодец
/7y3uK
Спасибо, попробую.
__________________
Это жжжж неспроста...
Sam Dark вне форума  
Старый 14.05.2005, 21:03     # 10
Willow
Junior Member
 
Регистрация: 23.12.2003
Адрес: Киев
Сообщения: 118

Willow Реально крут(а)Willow Реально крут(а)Willow Реально крут(а)Willow Реально крут(а)
А другие подозреваемые есть, а то тут всё вроде бы чисто?
Willow вне форума  
Старый 15.05.2005, 19:40     # 11
Sam Dark
Member
 
Аватар для Sam Dark
 
Регистрация: 03.07.2003
Адрес: Voronezh, Russia
Пол: Male
Сообщения: 294

Sam Dark МолодецSam Dark МолодецSam Dark Молодец
Willow
Даже не знаю... Попробовал как советовал /7y3uK. Памяти расходуется меньше, но съедается по прежнему. Как-то мне говорили, что какой-то из компонентов delphi ест память.
__________________
Это жжжж неспроста...
Sam Dark вне форума  
Старый 16.05.2005, 00:06     # 12
Willow
Junior Member
 
Регистрация: 23.12.2003
Адрес: Киев
Сообщения: 118

Willow Реально крут(а)Willow Реально крут(а)Willow Реально крут(а)Willow Реально крут(а)
Думаю это поможет:
http://v.mahon.free.fr/pro/freeware/memcheck/
Willow вне форума  
Старый 16.05.2005, 19:24     # 13
/7y3uK
Advanced Member
 
Аватар для /7y3uK
 
Регистрация: 09.03.2004
Адрес: толстозадая Москва
Сообщения: 498

/7y3uK Реально крут(а)/7y3uK Реально крут(а)/7y3uK Реально крут(а)/7y3uK Реально крут(а)
хм... прямо не знаю что еще посоветовать.... делать запрос динамически перед выполнением его создавать а в конце процедуры убивать его... это раз... если не поможет - попробуй таки ADO...
__________________
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
/7y3uK вне форума  
Старый 17.05.2005, 00:38     # 14
Willow
Junior Member
 
Регистрация: 23.12.2003
Адрес: Киев
Сообщения: 118

Willow Реально крут(а)Willow Реально крут(а)Willow Реально крут(а)Willow Реально крут(а)
Вообще с MSSQL действительно лучше работать через ADO. А что касается утечки памяти, то это здесь не причём.

В Delphi 7 я не замечал, что бы кто-то ел память, а в Delphi 6 было, но настолько не значительно, что заметно только с помощью того, что я дал в ссылке в 12 посту.
Willow вне форума  
Старый 18.05.2005, 00:57     # 15
Sam Dark
Member
 
Аватар для Sam Dark
 
Регистрация: 03.07.2003
Адрес: Voronezh, Russia
Пол: Male
Сообщения: 294

Sam Dark МолодецSam Dark МолодецSam Dark Молодец
Уже не знаю где это может быть...

В какой-то версии spinedit сжирал всё, но у меня его нет. Может есть ещё какая гадость.

Willow
Спасибо за ссылку, почитаю.
__________________
Это жжжж неспроста...
Sam Dark вне форума  
Старый 18.05.2005, 13:56     # 16
/7y3uK
Advanced Member
 
Аватар для /7y3uK
 
Регистрация: 09.03.2004
Адрес: толстозадая Москва
Сообщения: 498

/7y3uK Реально крут(а)/7y3uK Реально крут(а)/7y3uK Реально крут(а)/7y3uK Реально крут(а)
не слышал.... вооще то патчи можно по скачивать для дельфи и заплатки всякие на VCL с офф сайта... обычно там пишут что чего и где... у меня не возьникало таких проблем ни разу если честно... правда я в основном ADO пользуюсь...
__________________
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
/7y3uK вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 10:06.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.