IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Delphi. Программа постепенно сжирает всю память. (http://www.imho.ws/showthread.php?t=85293)

Sam Dark 08.05.2005 17:34

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;

Если кто знает в чём причина и как бороться - помогите.
Спасибо.

/7y3uK 09.05.2005 19:02

а какие симптомы у больного?
....
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;


blink 09.05.2005 21:06

С Delphi к сожалению не знаком, но очень похоже на memory leaks.

dyr_farot 10.05.2005 10:43

это они и есть. но в приведенной процедуре ничего такого не видно...
Sam Dark, обрати внимание на куски кода, в которых есть Create

Sam Dark 10.05.2005 21:13

Вложений: 1
Вот и первые проблемы. Delphi упал. Что-то я начал сомневаться, что это из за массивов (судя по тексту ошибки).

Al-x 10.05.2005 21:27

В ошибке как раз и говорится, что недостаточно памяти. Её и массив может заср...ть.
Цитата:

dyr_farot:
обрати внимание на куски кода, в которых есть Create
и ещё посмотри на все new/dispose (всё что создаёшь должно уничтожаться).
А по поводу массива - /7y3uK тему говорит, только не забывай dispose элементам списка делать.

Sam Dark 11.05.2005 10:38

Al-x
В том то и дело, что create-ов почти нет. Может ли BDE пакостить?

/7y3uK 11.05.2005 11:32

:ржать: :ржать:
повторяю - тебе массив твой пакостит - тут вполне можно без него обходиться...
BDE тут не при чем... не веришь - попробуй тоже самое, но через ADO сделать...

Sam Dark 12.05.2005 12:07

/7y3uK
Спасибо, попробую.

Willow 14.05.2005 21:03

А другие подозреваемые есть, а то тут всё вроде бы чисто? :idontnow:

Sam Dark 15.05.2005 19:40

Willow
Даже не знаю... Попробовал как советовал /7y3uK. Памяти расходуется меньше, но съедается по прежнему. Как-то мне говорили, что какой-то из компонентов delphi ест память.

Willow 16.05.2005 00:06

Думаю это поможет:
http://v.mahon.free.fr/pro/freeware/memcheck/

/7y3uK 16.05.2005 19:24

хм... прямо не знаю что еще посоветовать.... делать запрос динамически перед выполнением его создавать а в конце процедуры убивать его... это раз... если не поможет - попробуй таки ADO...

Willow 17.05.2005 00:38

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

В Delphi 7 я не замечал, что бы кто-то ел память, а в Delphi 6 было, но настолько не значительно, что заметно только с помощью того, что я дал в ссылке в 12 посту.

Sam Dark 18.05.2005 00:57

Уже не знаю где это может быть...

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

Willow
Спасибо за ссылку, почитаю.

/7y3uK 18.05.2005 13:56

не слышал.... вооще то патчи можно по скачивать для дельфи и заплатки всякие на VCL с офф сайта... обычно там пишут что чего и где... у меня не возьникало таких проблем ни разу если честно... правда я в основном ADO пользуюсь...


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

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