Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-8779
Kirill
2001-12-29 15:04
2002.02.04
Поиск в ADO Table


1-8848
Vlad@Delphi
2002-01-18 21:37
2002.02.04
Работа с архивами


1-8892
szap
2002-01-15 19:32
2002.02.04
Какая дата была была 5 дней назад?


1-8927
MystiX
2002-01-17 16:59
2002.02.04
Помогите!!!


1-8877
Ольга
2002-01-16 14:37
2002.02.04
ListBox-ы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский