imho.ws |
|
08.05.2005, 17:34 | # 1 |
Member
Регистрация: 03.07.2003
Адрес: Voronezh, Russia
Пол: Male
Сообщения: 294
|
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; 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; Спасибо.
__________________
Это жжжж неспроста... |
09.05.2005, 19:02 | # 2 |
Advanced Member
Регистрация: 09.03.2004
Адрес: толстозадая Москва
Сообщения: 498
|
а какие симптомы у больного?
.... 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. |
10.05.2005, 21:27 | # 6 | |
Junior Member
Регистрация: 30.03.2003
Адрес: СПб
Сообщения: 162
|
В ошибке как раз и говорится, что недостаточно памяти. Её и массив может заср...ть.
Цитата:
А по поводу массива - /7y3uK тему говорит, только не забывай dispose элементам списка делать.
__________________
640Kbytes should be enough for everything! (c) Bill Gates, 1981. Все "спасибо" в репутацию |
|
11.05.2005, 11:32 | # 8 |
Advanced Member
Регистрация: 09.03.2004
Адрес: толстозадая Москва
Сообщения: 498
|
повторяю - тебе массив твой пакостит - тут вполне можно без него обходиться... BDE тут не при чем... не веришь - попробуй тоже самое, но через ADO сделать...
__________________
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах |
15.05.2005, 19:40 | # 11 |
Member
Регистрация: 03.07.2003
Адрес: Voronezh, Russia
Пол: Male
Сообщения: 294
|
Willow
Даже не знаю... Попробовал как советовал /7y3uK. Памяти расходуется меньше, но съедается по прежнему. Как-то мне говорили, что какой-то из компонентов delphi ест память.
__________________
Это жжжж неспроста... |
16.05.2005, 00:06 | # 12 |
Junior Member
Регистрация: 23.12.2003
Адрес: Киев
Сообщения: 118
|
Думаю это поможет:
http://v.mahon.free.fr/pro/freeware/memcheck/ |
16.05.2005, 19:24 | # 13 |
Advanced Member
Регистрация: 09.03.2004
Адрес: толстозадая Москва
Сообщения: 498
|
хм... прямо не знаю что еще посоветовать.... делать запрос динамически перед выполнением его создавать а в конце процедуры убивать его... это раз... если не поможет - попробуй таки ADO...
__________________
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах |
17.05.2005, 00:38 | # 14 |
Junior Member
Регистрация: 23.12.2003
Адрес: Киев
Сообщения: 118
|
Вообще с MSSQL действительно лучше работать через ADO. А что касается утечки памяти, то это здесь не причём.
В Delphi 7 я не замечал, что бы кто-то ел память, а в Delphi 6 было, но настолько не значительно, что заметно только с помощью того, что я дал в ссылке в 12 посту. |
18.05.2005, 00:57 | # 15 |
Member
Регистрация: 03.07.2003
Адрес: Voronezh, Russia
Пол: Male
Сообщения: 294
|
Уже не знаю где это может быть...
В какой-то версии spinedit сжирал всё, но у меня его нет. Может есть ещё какая гадость. Willow Спасибо за ссылку, почитаю.
__________________
Это жжжж неспроста... |
18.05.2005, 13:56 | # 16 |
Advanced Member
Регистрация: 09.03.2004
Адрес: толстозадая Москва
Сообщения: 498
|
не слышал.... вооще то патчи можно по скачивать для дельфи и заплатки всякие на VCL с офф сайта... обычно там пишут что чего и где... у меня не возьникало таких проблем ни разу если честно... правда я в основном ADO пользуюсь...
__________________
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах |