Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];




Вниз

Программа и память. 


Лана Розанова   (2002-01-18 12:10) [0]

При работе программы по таймеру происходит опрос внешних устройств и их состояние записывается в от 1 до 30 таблиц БД.
При этом увеличивается размер занимаемой памяти.
Что делать?



Johnny Smith   (2002-01-18 12:14) [1]

Используешь БДЕ?
Если да, то так и должно быть - они, подлые, кешируют все в памяти.
Предлагаю с определенной периодичностью делать TTable.close
Тогда все изменения сбрасываются на диск, а кеш освобождается.



Лана Розанова   (2002-01-18 12:20) [2]

> Johnny Smith
А при новом открытии писать Table1.Open?



Johnny Smith   (2002-01-18 12:22) [3]

Ага!



Лана Розанова   (2002-01-18 12:23) [4]

Спасибо, попробуем...



Лана Розанова   (2002-01-18 12:41) [5]

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



Andrey   (2002-01-18 12:47) [6]

Перечитай сообщения:

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1011183379&n=3
Digitman (16.01.02 16:42)
Digitman (16.01.02 17:20)

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1011184214&n=3
Digitman (16.01.02 17:32)



Polevi   (2002-01-18 12:47) [7]

Попробуй не использовать таблицы - записывай данные в БД запросом



Johnny Smith   (2002-01-18 12:55) [8]

Проблема в том, что запросы через TQuery с локальными таблицами работают медленно. Мне кажется, стоит покопаться в коде - нет ли где утечек.



Лана Розанова   (2002-01-18 13:17) [9]

Вот код

procedure TSeeParam.Timer1Timer(Sender: TObject);
begin
inc(i1);
IniFile:=TIniFile.Create(MyPath+"DAN.INI");
IniFile.EraseSection("Answer");
IniFile.Free;
Posta[25]:=inttostr(i1);
Posta[26]:=inttostr(koldan);
Posta[27]:=MyPath;
Posta[28]:=inttostr(hPort);
res:=nil;
//Запуск dll для чтения телеграммы
@ScanForever:=nil;
HLib:=LoadLibrary("scafor.dll");
if HLib>=32 then
begin
@ScanForever:=GetProcAddress(HLib,"ScanForever");
if @ScanForever<>nil then
res:=ScanForever(Posta);
resstr:=res;
end;
FreeLibrary(HLib);
if resstr<>"false" then
begin
IniFile:=TIniFile.Create(MyPath+"DAN.INI");
if IniFile.ReadString("Answer","ErrorMes","")<>"" then
Errors.Memo1.Lines.Add(IniFile.ReadString("Answer","ErrorMes",""));
Table1.DatabaseName:=IniFile.ReadString("Answer","DataBaseName","");
Table1.TableName:=IniFile.ReadString("Answer","TableName","");
Table1.Active:=true;
Table1.Last;
Table1.Insert;
Table1.Edit;
Table1Time.Value:=IniFile.ReadString("Answer","Time","");
Table1Referense.Value:=IniFile.ReadString("Answer","Reference","");
Table1FeedBack.Value:=IniFile.ReadString("Answer","FeedBack","");
Table1Freq.Value:=IniFile.ReadString("Answer","Freq","");
Table1Curr.Value:=IniFile.ReadString("Answer","Curr","");
Table1PowerW.Value:=IniFile.ReadString("Answer","PowerW","");
Table1PowerHP.Value:=IniFile.ReadString("Answer","POwerHP","");
Table1VoltM.Value:=IniFile.ReadString("Answer","VoltM","");
Table1VoltDC.Value:=IniFile.ReadString("Answer","VoltVLT","");
Table1TempM.Value:=IniFile.ReadString("Answer","TempM","");
Table1TempVLT.Value:=IniFile.ReadString("Answer","TempVLT","");
Table1PulseRef.Value:=IniFile.ReadString("Answer","PulseRef","");
Table1TempRad.Value:=IniFile.ReadString("Answer","TempRad","");
Table1.Post;
Table1.Active:=false;
Table1.Close;
if IniFile.ReadString("Answer","Alarm","")<>"" then
Errors.Memo1.Lines.Add(Datetostr(date)+" "+timetostr(time)+" "+
"Авария: "+
IniFile.ReadString("Answer","Alarm",""));
if IniFile.ReadString("Answer","Warning","")<>"" then
Errors.Memo1.Lines.Add(Datetostr(date)+" "+timetostr(time)+" "+
"Предупреждение: "+
IniFile.ReadString("Answer","Warning",""));
IniFile.Free;
end
else
List.Checked[i1-1]:=false;
if i1=KolDan then
i1:=0;
Errors.Memo1.Lines.SaveToFile(MyPath+"DBChartDan\"+dates+"\errors.mes");
end;



Johnny Smith   (2002-01-18 13:25) [10]

На первый взгляд, все путем.
Но есть две фенечки, обращающие на себя внимание:
1. Dll-ка. Нет ли чего там вредного?
2. Использование Free иногда приводит к тому, что не высвобождаются буфера памяти (был как раз недавно у меня такой случай). Попробуй Destroy, а лучше (я так делаю, например) создавать и уничтожать всякие объекты пореже, лучше один раз создать, а потом один раз уничтожить.



Лана Розанова   (2002-01-18 13:31) [11]

> Johnny Smith

В DLL только связь по СОМ порту, считывание и анализ.
А когда ставлю Table1.Open то пишет ошибку.
Моджет еще как нибудь можно?



Johnny Smith   (2002-01-18 13:36) [12]

Насчет COM-порта: уж не пишется ли чего-нибудь в буфер из него, после того, как ты делаешь free для dll-ки? Ты делаешь закрытие Handl"а после того, как прочтешь почту?



Andrey   (2002-01-18 13:41) [13]

> Johnny Smith
"2. Использование Free иногда приводит к тому, что не высвобождаются буфера памяти ..." - метод Free вызывает Destroy.

> Лана Розанова
Все выглядит очень правдоподобно, по этому методом научного тыка, а именно исключяя по очереди все фрагменты кода можно выявить какой дает утечку ресурсов.



Digitman   (2002-01-18 14:20) [14]

Ой-ой-ой !)
Ну, ты нагородила !)
Столько несуразиц, что просто теряюсь, с чего начать-то ....

Ладно, давай с первой бросившейся в глаза.
Table1.Last; // зачем ? что тебе нужно в последней записи ?
Table1.Insert; // ну, это понятно - переводишь НД в режим вставки
Table1.Edit; // а это-то зачем ? нечего еще редактировать - записи-то физически еще нет ! она появится только после Table1.Post !


Тут до проблем с памятью еще - как до Китая) ...
Период таймера какой ? Всякий раз при срабатывании таймера ты делаешь кучу "холостой" работы : грузишь/освобождаешь DLL, по два раза открываешь INI-файл, гоняешь таблицу туда-сюда между Open и Close и пр. и пр. ....



Набережных С.   (2002-01-18 18:11) [15]

Попробуйте Table1.FlushBuffers;




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.039 c
4-9036            Chup                  2001-12-03 16:16  2002.02.04  
Как убить процесс сеанса дос.


1-8872            IronHawk              2002-01-15 18:30  2002.02.04  
ОКРУГЛЕНИЕ ! ! ! . . .


3-8762            Олег Лаукарт          2002-01-04 14:50  2002.02.04  
указание значения-даты в запросе


3-8781            Alexm                 2002-01-07 16:06  2002.02.04  
Вопрос!


6-8958            DenKop                2001-11-08 00:43  2002.02.04  
Сообщения Windows