Главная страница
    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
1-8898
nikols
2002-01-16 17:13
2002.02.04
Как получить текст HTML у TWebBrowser?


1-8843
saviola
2002-01-17 15:40
2002.02.04
Как получить из DateTimePicker.Date целое значение без дроби


1-8839
Tym
2002-01-21 00:47
2002.02.04
обращение к функциям Mathcad из Delphi!


6-8967
Burmistroff
2001-11-10 20:28
2002.02.04
Как узнать, прослушивается ли уже данный порт?


1-8852
Bazzilio
2002-01-15 16:31
2002.02.04
Проблема считать данные из двочного Dos-овского файла





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский