Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2013, 16:04   #1
SkOle
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 29
По умолчанию Проблемы с утечкой памяти (CreateProcess и INDY)

Народ, всем ку!

Помоги решить проблему с утечкой памяти, а именно:

имеется код, который вызывает криптопрограмму для каждого файла из списка, ждет выполнения программы и идет дальше по списку...

Код:
ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
ZeroMemory(@ProcessInfo, SizeOf(ProcessInfo));

StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_HIDE;

CreateProcess(PChar(String(CryptorPath)),
   PChar(String(CryptorParam + '"' + FileList.Strings[j] + '"')),
   nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
   nil, nil, StartupInfo, ProcessInfo);
while WaitForSingleObject(ProcessInfo.hProcess, 100) = WAIT_TIMEOUT do
   Application.ProcessMessages;

GetExitCodeProcess(ProcessInfo.hProcess, ResultCode);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
Все работает без проблем, НО! после обработки файла память, выделяемая на CreateProcess не очищается, ReportMemoryLeaks утечек не видит, а вот поганый диспетчер кажет все грешки

Плюс такая же беда и с:

Код:
idSMTP := TIdSMTP.Create(nil);
idSMTP.Host := MailHostOut;
idSMTP.Port := MailPortOut;
idSMTP.Username := MailUser;
idSMTP.Password := MailPassword;
idSMTP.Connect;

idMessage := TIdMessage.Create(nil);
idMessage.CharSet := 'windows-1251';
idMessage.From.Address := MailUser;
idMessage.Recipients.EMailAddresses := MailRecipient;
idMessage.Subject := MailSubject;
idMessage.Body := ParseStr(MailBody, '#13');

idAttachment := TIdAttachmentFile.Create(idMessage.MessageParts,
   DirectoryTemp + ExtractFileName(FileList.Strings[i]));

if idSMTP.Connected then
   begin
      idSMTP.Send(idMessage);
      Application.ProcessMessages;
      idSMTP.Disconnect;
   end;

FreeAndNil(idAttachment);
idMessage.Free;
idSMTP.Free;
После отправки письма память не вычищается...
Ладно если бы задача была разовая, за день через нее проходит около 500 файлов. ПРОШУ ПОМОЩИ, проект уже горит

Последний раз редактировалось SkOle; 26.01.2013 в 16:46.
SkOle вне форума Ответить с цитированием
Старый 26.01.2013, 17:49   #2
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
По умолчанию

с чего ты взял, что там есть утечка?
beegl вне форума Ответить с цитированием
Старый 26.01.2013, 18:10   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

с того, что без try finally код в конце может не выполниться вообще, по причине ошибок в соединении/передачи и т.д и т.п.
Человек_Борща вне форума Ответить с цитированием
Старый 26.01.2013, 18:17   #4
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
По умолчанию

тем более, когда код написан страшным образом
книжку по рефакторингу почитай, про дельфевскую кучу, фрагментацию кучу и кэширование
beegl вне форума Ответить с цитированием
Старый 27.01.2013, 14:21   #5
SkOle
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 29
По умолчанию

Цитата:
Сообщение от beegl Посмотреть сообщение
тем более, когда код написан страшным образом
книжку по рефакторингу почитай, про дельфевскую кучу, фрагментацию кучу и кэширование
При чем тут это?! если утечка идет при работе с динамическими компонентами (что касается Indy) и CreateProcess? утечка в первом случае идет имеено после вызова стороннего приложения, а во втором случае при отправке письма... причем тут кучи и пр?
P.S. код написан страшным образом? смешно, значит у нас половина программеров пишут "страшные коды".
SkOle вне форума Ответить с цитированием
Старый 27.01.2013, 14:33   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я вот чего не могу понять:
Цитата:
память, выделяемая на CreateProces
Какая память то? Эта функция создает отдельный процесс. Получается что он не закрывается нормально что ли?
Цитата:
поганый диспетчер кажет все грешки
Так ведь диспетчер то еще не показатель "чистоты спирта".
Еще такой момент:
Цитата:
while WaitForSingleObject(ProcessInfo.hPr ocess, 100) = WAIT_TIMEOUT do
Application.ProcessMessages;
Т.е. запуски идут прямо в главном потоке?
Тогда стесняюсь спросить, почему не в сопроцессе это делать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.01.2013, 14:48   #7
SkOle
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 29
По умолчанию

>> Я вот чего не могу понять:
>> Цитата:
>> память, выделяемая на CreateProces
>> Какая память то? Эта функция создает отдельный процесс. Получается что он не закрывается нормально что ли?

Оперативка не освобождается, моя программа вызывает другую, ждет завершения ее работы и идет дальше, при это оперативка не очищается после вызова сторонней программы, а поскольку работа идет в цикле с большим количеством файлов, то происходит переполнение

>> Еще такой момент:
>> Цитата:
>> while WaitForSingleObject(ProcessInfo.hPr ocess, 100) = WAIT_TIMEOUT do
>> Application.ProcessMessages;
>> Т.е. запуски идут прямо в главном потоке? Тогда стесняюсь спросить, почему не в сопроцессе это делать?

Да, запуск идет в основном потоке, я думал в сторону создания отдельного потока, но я не умею с ними работать, я сисадмин, и пишу софт редко
SkOle вне форума Ответить с цитированием
Старый 27.01.2013, 15:18   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
я сисадмин, и пишу софт редко
Так стоп! Тогда самый главный вопрос: Тебе это зачем нужно? Откуда у задачи ноги растут и какие цели преследуются? Не исключаю что и без программирования особого возможно ее решить.
Цитата:
моя программа вызывает другую
Так вот скорее всего она и не убирается за собой.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.01.2013, 17:26   #9
SkOle
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 29
По умолчанию

>> Так стоп! Тогда самый главный вопрос: Тебе это зачем нужно? Откуда у задачи
>> ноги растут и какие цели преследуются? Не исключаю что и без
>> программирования особого возможно ее решить.

Смысл задачи в автоматизации криптования файлов через File-PRO, без программирования никак, там надо отловить окно запроса пароля на сертификат, передать ему пасс и тыкнуть кнопку "ок", потом зашифрованный файл отправить на указанный адрес почтовый + принимать почту с указанного адреса, если есть вложение с шифрованым файлом, то его надо распаковать (обратно таки через отлов окон) и далее по правилам раскладывать в определенные места

>> Так вот скорее всего она и не убирается за собой.
я смотрел через ProcessExplorer, File-PRO рождается как дочерний процесс от моей программы, после выполенения прибивается, но при этом объем памяти после окончания работы File-PRO не уменьшается

P.S. все работает как надо, но при работе с File-PRO и почтой жрется оператива

Последний раз редактировалось SkOle; 27.01.2013 в 17:28.
SkOle вне форума Ответить с цитированием
Старый 27.01.2013, 17:34   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Код:
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
Наоборот надо.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CreateThread непонятки с утечкой памяти fucil Общие вопросы Delphi 3 15.01.2013 20:50
Проблема с утечкой памяти mr_cipher C# (си шарп) 10 28.08.2012 14:18
Проблема с утечкой памяти ExPeL Win Api 4 21.10.2010 22:13
самописный assert: проблема с утечкой памяти) sashonk Общие вопросы C/C++ 2 26.04.2010 15:58
Indy в потоке - утечка памяти PUH Фриланс 5 28.12.2009 14:06