Форум: "Основная";
Текущий архив: 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;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c