Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.06.05;
Скачать: [xml.tar.bz2];

Вниз

Утечка памяти   Найти похожие ветки 

 
Sandman25   (2003-05-22 18:12) [0]

Программа висит в трэе и жрет память - по 4kb каждые несколько минут. Поставил точку останова и прошел по всем выполняющимся строкам. Выполняющиеся строки приведены ниже, они сейчас одни и те же (файлов в каталог для печати я не добавлял).

type TFMain=class(TForm)
...
lFirstTime,
FirstTime: boolean;
IndexOfPrinter: integer;
...
end;
const
FTP_PREFIX = "FTP:";
FTP_PREFIX_LENGTH = Length(FTP_PREFIX);
...
procedure TFMain.TimerTimer(Sender: TObject);
var
PathDir: string;
i: integer;
begin
Timer.Enabled := False;
try
lFirstTime := FirstTime;
if FirstTime then
begin // не выполняется
...
end;
for i := 0 to FPrinters.lbDirs.Items.Count - 2 do
begin
PathDir := FPrinters.lbDirs.Items.Strings[i];
if (Length(PathDir) = 0) then
continue;
IndexOfPrinter := Printer.Printers.IndexOf(FPrinters.lbPrinters.Items.Strings[i]);
if not((Length(PathDir)>FTP_PREFIX_LENGTH)
and (Copy(PathDir,1,FTP_PREFIX_LENGTH)=FTP_PREFIX)) then
PrintFile(PathDir+"\");
end;
finally
Timer.Enabled := cbPrint.Checked;
end;

procedure TFMain.PrintFile(PathDir: string);
begin
try
if IndexOfPrinter >= 0 then
begin
if Printer.Printing then // не выполняется
begin
...
end;
Printer.PrinterIndex := IndexOfPrinter;
if not ProcessDir(PathDir,...)
then
begin // не выполняется
...
end;
end;
except
... не выполняется
end;
end;

function ProcessDir(Path, Mask: string; ...pLeftIndent: boolean; pLeftIndentValue: integer):boolean;
const
Maska = faAnyFile and not faDirectory;
var
Search: TSearchRec;
FileCount: integer;
begin
Result := true;
if not pLeftIndent then
pLeftIndentValue := -1;
if pWarning then // не выполняется
begin
end;
if FindFirst(Path+Mask, Maska, Search) <> 0 then
begin
SysUtils.FindClose(Search);
exit;
end;
...
end;


По сути выполняются только сравнения, присваивания строк, TStrings.IndexOf, FindFirst (с FindClose), сравнение Copy(aString,1,4)="FTP:". Я посмотрел, что происходит при присваивании Printer.PrinterIndex, там тоже вроде бы ничего криминального. В чем может быть проблема?


 
VMcL   (2003-05-22 18:34) [1]

Может из-за этого:


//if FindFirst(Path+Mask, Maska, Search) <> 0 then
if FindFirst(Path+Mask, Maska, Search) = 0 then
begin
SysUtils.FindClose(Search);
exit; // ?
end;


 
Юрий Зотов   (2003-05-22 18:38) [2]

У Вас:

if FindFirst(Path+Mask, Maska, Search) <> 0 then
begin
SysUtils.FindClose(Search);
exit;
end;

В примере из хелпа:

if FindFirst(Edit1.Text, FileAttrs, sr) = 0 then
begin
...
FindClose(sr);
end;

Почувствуйте разницу!

"FindFirst returns 0 if a file was successfully located, otherwise, it returns a Windows error code."


 
Sandman25   (2003-05-22 18:55) [3]

Сначала у меня FindClose был только при успехе, как в help.
Но утечка была, я залез в SysUtils и там в комментариях нашел, что любой вызов FindFirst должен закрываться FindClose.
Кстати, FindClose проверять параметр на корректность, и в случае неверного параметра ничего не делает. Прошу посетить мой другой топик http://delphimaster.net/view/1-1053614694/ Он тесным образом связан с этим...


 
Sandman25   (2003-05-22 18:58) [4]

SysUtils.pas
{ FindFirst searches the directory given by Path for the first entry that
matches the filename given by Path and the attributes given by Attr. The
result is returned in the search record given by SearchRec. The return
value is zero if the function was successful. Otherwise the return value
is a system error code. After calling FindFirst, always call FindClose.
FindFirst is typically used with FindNext and FindClose as follows:

Result := FindFirst(Path, Attr, SearchRec);
while Result = 0 do
begin
ProcessSearchRec(SearchRec);
Result := FindNext(SearchRec);
end;
FindClose(SearchRec);

where ProcessSearchRec represents user-defined code that processes the
information in a search record. }


 
Юрий Зотов   (2003-05-22 19:23) [5]

Кусок кода из FindFirst:
if Result <> 0 then FindClose(F);
Думаю, на вопрос "всегда или не всегда" этот кусок отвечает.


> Кстати, FindClose проверять параметр на корректность, и в
> случае неверного параметра ничего не делает.

Не совсем так. Проверяется только хэндл, а остальное - нет (см. исходники FindFirst и FindMatchingFile).

Исправьте, у Вас стоит явно неверное условие вызова FindClose.

А другую ветку сейчас посмотрим.


 
VaS   (2003-05-22 19:27) [6]

Советую применять TurboPower CodeWatch - не только выловишь все лики, но и поймешь некоторые тонкие вещи, которые сейчас не понимаешь.


 
Sandman25   (2003-05-23 10:11) [7]

Спасибо.
Вызов FindClose исправлю.
TurboPower CodeWatch попробую найти.


 
Sandman25   (2003-05-23 10:21) [8]

2VaS
TurboPower уже не принимает заказы на CodeWatch. К тому же CodeWatch еще и платный... Нет ли других компонентов?


 
VaS   (2003-05-23 11:15) [9]

Sandman25: http://www.turbopower.com/ordering/prices/ - цены (QA3 - $600). http://www.turbopower.com/products/sleuthqa/ - описание.
От себя могу сказать такую вещь - с ловлей ликов в Делфи5 довольно неплохо справлялся MemProof (freeware) в купе с MemCheck (модуль, подключаемый к проекту и преобразующий лики в исключения + лог со стеком). Но MemorySleuth (ныне CodeWatch в составе QA Suite) - это совершенно другой уровень. Скорость работы порядка на два выше MemProof, а качество выше всяких похвал - никаких "фантомных" утечек, ничего не пропускает (делали спец. тесты). Так что если позволяют финансы - купите. Если нет - купите на левом CD (точно есть) :) В этот же QA Suite входят 2 профайлера. Сильно не гоняли еще, но впечатления пока приятственные...


 
Sandman25   (2003-05-23 11:29) [10]

2Vas
Спасибо!
Я только что скачал MemProof с
http://www.automatedqa.com/downloads/memproof.asp
и вроде бы все с моей программой в порядке :)
Попробую еще найти MemCheck.
Насчет CodeWatch - финансы не позволяют. Я в основном работаю на Informix-4GL под Unix, так что Delphi - всего лишь вспомогательное средство для особых хадач, и руководство вряд ли выделит финансы, особенно такую сумму... Разве что на левый сидюк дадут :)
Профайлер я использую встроенный в среду, в виде компонента Delphi - ZProf или что-то подобное.
Еще раз спасибо.



Страницы: 1 вся ветка

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

Наверх





Память: 0.48 MB
Время: 0.009 c
1-13235
sKeeper
2003-05-27 09:13
2003.06.05
Как поставить моё окно поверх всего отображаемого ?


1-13290
Maxim Pshevlotsky
2003-05-24 12:44
2003.06.05
Ошибка при обращении к DCOM обьекту


3-13096
Ergoist
2003-05-19 11:05
2003.06.05
Многострочный DBEdit


3-13053
gizar
2003-05-16 17:00
2003.06.05
LookUp - помогите!!! Может кто встречался с задачей.


1-13196
DDDeN
2003-05-21 17:56
2003.06.05
Добавление версии файла в другие файлы





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