|
Вопрос # 4 811/ вопрос открыт / |
|
Вечер добрый.
Сложность в поиске утечки памяти. Сама программа работает, но ее объем в ОП увеличивается просто невероятными темпами. Раньше никогда на подобное не обращал внимания, но сейчас без этого не обойтись. Хотелось бы спросить совета, вообще на что обращать внимание. Первое что вспомнил - это про деструкторы и закрытие файлов. Код прилагается.
Зы: установил FastMM4, но при разблокировании параметров выдает :
[Error] FastMM4Options.inc(126): Declaration expected but number found
на параметре $define FullDebugMode.
Заранее спасибо.
Приложение: Переключить в обычный режим- //------------------------------------------------------------------------------
- procedure TForm1.Button1Click(Sender: TObject);
- var
- i: integer;
- WordList: TStringList;
- Document: IHTMLDocument2;
- begin
- //--
- TopList:=TStringList.Create;
- BottomList:=TStringList.Create;
- TopList.LoadFromFile('CSS/Template_top.html');
- BottomList.LoadFromFile('CSS/Template_bottom.html');
- //--
-
- WordList:=TStringList.Create;
- WordList.LoadFromFile('base/IrVerb.txt');
- for i:=0 to WordList.Count-1 do
- begin
- DoingFile(WordList[i]);
- end;
- WordList.Free;
- TopList.Free;
- BottomList.Free;
- end;
- //------------------------------------------------------------------------------
- procedure TForm1.SaveHTMLSourceToFile(const FileName: string;
- WB: TWebBrowser);
- var
-
- PersistStream: IPersistStreamInit;
- FileStream: TFileStream;
- Stream: IStream;
- SaveResult: HRESULT;
- begin
- PersistStream := WB.Document as IPersistStreamInit;
- FileStream := TFileStream.Create(FileName, fmCreate);
- try
- Stream := TStreamAdapter.Create(FileStream, soReference) as IStream;
- SaveResult := PersistStream.Save(Stream, True);
- if FAILED(SaveResult) then
- MessageBox(Handle, 'Fail to save HTML source', 'Error', 0);
- finally
- FileStream.Free;
- end;
-
- end;
- //------------------------------------------------------------------------------
- procedure TForm1.DoingFile (Name: string);
- var
- FileName: string;
- begin
-
Edit1.text:='http://lingvo.yandex.ru/'+Name+'/ñ%20àíãëèéñêîãî/';
- WebBrowser1.Navigate(edit1.text);
-
- while WebBrowser1.ReadyState<READYSTATE_COMPLETE
- do Application.ProcessMessages;
-
- FileName:='Temp.html';
- SaveHTMLSourceToFile(FileName, WebBrowser1);
- //--
- MyList:=TStringList.Create;
- MyList.LoadFromFile('Temp.html');
- //--
- Parser(Name);
- end;
- //------------------------------------------------------------------------------
- procedure TForm1.Parser(Name: string);
- var
- //MyList, MyAddList, TopList, BottomList, ReadyList: TStringList;
- Str, str_list: string;
- i, posit, posit2, len: integer;
- flag: boolean;
- FileName: string;
-
- begin
-
- flag:=false;
- ReadyList:=TStringList.Create;
- MyAddList:=TStringList.Create;
- { ReadyList:=TStringList.Create;
- TopList:=TStringList.Create;
- BottomList:=TStringList.Create;
- TopList.LoadFromFile('CSS/Template_top.html');
- BottomList.LoadFromFile('CSS/Template_bottom.html');
- MyList:=TStringList.Create;
- MyAddList:=TStringList.Create;
- MyList.LoadFromFile('Temp.html'); }
-
- for i:=0 to MyList.count-1 do
- begin
- if (pos('"b-translate"',MyList[i])<>0) then flag:=true;
- if (pos('"b-container"',MyList[i])<>0) then flag:=false;
- if flag=true then
- begin
- MyAddList.Add(Utf8Decode(MyList[i]));
- end;
- if (pos('"b-translate__tr"',MyList[i])<>0) then
- begin
- posit:=pos('"b-translate__tr">', MyList[i]);
- posit2:=pos('</span>]', MyList[i]);
- len:= posit2-posit-18;
- str_list:=(MyList[i]);
- delete(str_list,posit+18,len);
- end;
- end;
-
- for i:=0 to TopList.Count-1 do
- ReadyList.Add(TopList[i]);
- // for i:= 0 to MyAddList.Count-1 do
- // ReadyList.Add(MyAddList[i]);
- ReadyList.Add(Utf8Decode(str_list));
- for i:= 0 to BottomList.Count-1 do
- ReadyList.Add(BottomList[i]);
-
- FileName:='IrVerb/'+Name+'.html';
- ReadyList.SaveToFile(FileName);
-
- ReadyList.Free;
- MyAddList.Free;
- MyList.Free;;
-
- end;
- //------------------------------------------------------------------------------
 |
Вопрос задал: ToDayGoodDay (статус: Посетитель)
Вопрос отправлен: 12 декабря 2010, 22:22
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, ToDayGoodDay!
бегло просмотрел - нашел несколько подозрительных мест.
процедура SaveHTMLSourceToFile
объект Stream : TStreamAdapter создается, но не освобождается (нет вызова метода free).
объект mylist лучше уж создавать и удалять в одном методе. А в метод parse передавать по ссылке. И от глобального объекта избавиться.
Также стоит помнить, что много памяти есть встроенный браузер. Тут уж сложно что то сделать, кроме как отказаться от него в пользу idHttp или аналогов.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 12 декабря 2010, 22:54
Оценка за ответ: 5
Комментарий к оценке: Stream это объект IStream, я , может плохо искал, но не нашел у него деструктора.
Еще, сразу уж, вопрос про :
установил FastMM4, но при разблокировании параметров выдает :
[Error] FastMM4Options.inc(126): Declaration expected but number found
на параметре $define FullDebugMode.
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|