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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2013, 15:29   #21
SkOle
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 29
По умолчанию

>> Ошибки скорее всего вы создаете, а не не средства которые вы используете.
Я поэтому и прошу ткнуть носом, где ошибка?
SkOle вне форума Ответить с цитированием
Старый 29.01.2013, 06:42   #22
SkOle
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 29
По умолчанию

Код:
//                idSMTP.Connect;
//                try
//                  idSMTP.Send(idMessage);
//                finally
//                  idSMTP.Disconnect;
//                end;
После вызова этой конструкции начинается жор оперативки. Если эти строчки закомментированы, то все нормально

Собственно сам цикл:
Код:
if FindFiles(DirectoryTemp, '*.enc', FileList) then
      try
        for FileCount := 0 to FileList.Count - 1 do
        begin
          FileName := ExtractFileName(FileList.Strings[FileCount]);

          idSMTP := TIdSMTP.Create(nil);
          try
            idSMTP.Host := MailHost;
            idSMTP.Username := MailUser;
            idSMTP.Password := MailPassword;

            idMessage := TIdMessage.Create(nil);
            try
              idMessage.ContentType := 'text/html; charset=windows-1251';
              idMessage.ContentTransferEncoding := '8bit';
              idMessage.Date := Now;
              idMessage.From.Name := MailSender;
              idMessage.From.Address := MailUser;
              idMessage.Recipients.EMailAddresses := MailRecipient;
              idMessage.Subject := MailSubject;
              idMessage.Body.Text := MailBody;

              try
                idAttachment := TIdAttachmentFile.Create(idMessage.MessageParts,
                  FileList.Strings[FileCount]);

//                idSMTP.Connect;
//                try
//                  idSMTP.Send(idMessage);
//                finally
//                  idSMTP.Disconnect;
//                end;
              finally
                FreeAndNil(idAttachment);
              end;
            finally
              FreeAndNil(idMessage);
            end;
          finally
            FreeAndNil(idSMTP);
          end;
        end;
      finally
        FileName := '';
        FileList.Clear;
      end;

Последний раз редактировалось SkOle; 29.01.2013 в 06:45.
SkOle вне форума Ответить с цитированием
Старый 29.01.2013, 07:06   #23
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Я в инди не бум бум, но разве не осмысленней создавать что-то ( у Вас 3 объекта, 2 из которых, я подозреваю, можно единожды создавать) вне цикла, чтоб не крутилось "по сту" раз?
Для определенности я бы ещё почитал справку по всем инди-конструкциям что Вы используете и даже поглядел код, который стоит за этим, чтобы увязать то , что в справке и как оно "под капотом" - не глубоко, конечно, но до винапи хотя бы.

Просто в работе с сетью есть такие вещи как треды - для асинхронной работы - в них легко можно терять память, также есть контракты работы с сокетами - когда потоки переданные сокету высвобождаются сами или ещё какие тонкости.

Для отладки утечек читаем сюда http://www.gunsmoker.ru/2009/05/blog-post_24.html
в принципе можно сначала взять какой-то примитив - типа обрамлять подозрительные блоки в проверку по AllocMemSize.

И это всё ещё даже не закапываясь в винапи

Способов масса, в общем, успехов

Последний раз редактировалось phomm; 29.01.2013 в 07:10.
phomm вне форума Ответить с цитированием
Старый 29.01.2013, 09:17   #24
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вопросы:
1) Письма доходят?
2) Обновить ИНДИ до версии поновее или скачать stable версию не пробовал?

Есчо такой момент сугубо индивидуальный:
Код:
                idSMTP.Connect;
                try
                  idSMTP.Send(idMessage);
                except on e:Exception do ShowMessage(e.nessage); end;
                idSMTP.Disconnect;
А то вдруг у тебя там ошибки так и ползут, а ты не замечаешь.
I'm learning to live...

Последний раз редактировалось Stilet; 29.01.2013 в 09:20.
Stilet вне форума Ответить с цитированием
Старый 29.01.2013, 10:37   #25
SkOle
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 29
По умолчанию

1. Письма доходят, без проблем
2. Последние стоят
3. on E.Exection ничего не показывает
SkOle вне форума Ответить с цитированием
Старый 29.01.2013, 16:41   #26
SkOle
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 29
По умолчанию

Нашел ответ на одном из забугорных форумов, оказывается Indy 10 старадает утечкой, все рекомендуют использовать 9.0.18 версию (последний стейбл)... Вопрос можно считать закрытым, посути код правильный, проблема встала в самих компонентах

P.S. перевел проект на ICS, утечки ушли
SkOle вне форума Ответить с цитированием
Старый 29.01.2013, 16:43   #27
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
все рекомендуют использовать 9.0.18 версию (последний стейбл)
Как я и предполагал...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.02.2013, 02:39   #28
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
По умолчанию

Код:
var
  htmpart, txtpart: TIdText;
  bmppart: TIdAttachment;
  email: TIdMessage;
  IdSMTP: TIdSMTP;
begin
  try
    email := TIdMessage.Create(nil);
    try
      email.From.Text := 'teste@website.com';
      email.Recipients.EMailAddresses :='teste2@website.com';
      email.Subject := 'Hello';
      email.ContentType := 'multipart/alternative';
 
      txtpart := TIdText.Create(email.MessageParts);
      txtpart.ContentType := 'text/plain';
 
      txtpart := TIdText.Create(email.MessageParts);
      txtpart.ContentType := 'multipart/related; type="text/html"';
 
      htmpart := TIdText.Create(email.MessageParts, nil);
      htmpart.ContentType := 'text/html';
      htmpart.Body.Add('<html>');
      htmpart.Body.Add('<head>');
      htmpart.Body.Add('</head>');
      htmpart.Body.Add('<body><h1>Hello</h1>');
      htmpart.Body.Add('<img src="cid:us.jpg" />');
      htmpart.Body.Add('This is a picture of us!</body>');
      htmpart.Body.Add('</html>');
      htmlpart.ParentPart := 1;
 
      bmppart := TIdAttachmentFile.Create(email.MessageParts, ExtractFilePath(Application.ExeName) 
+ 'logo.JPG');
      bmppart.ContentType := 'image/jpeg';
      bmppart.ContentDisposition := 'inline';
      bmppart.ContentID := 'us.jpg';
      bmppart.DisplayName := 'us.jpg';
      bmppart.ParentPart := 1;
 
      IdSMTP := TIdSMTP.Create(nil);
      try
        IdSmtp.Host := ...;
        IdSMTP.Username := ...;
        IdSMTP.Password := ...;
 
        IdSMTP.Connect;
        try
          IdSMTP.Send(email);
        finally
          IdSMTP.Disconnect;
        end;
      finally
        IdSMTP.Free;
      end;
    finally
      email.Free;
    end;
    Application.MessageBox('Send OK!', '', MB_OK);
  except
    on E: Exception do
    begin
      Screen.Cursor := CrDefault;
      Application.MessageBox(PChar('ERRO !'#10#10 
+ E.Message), 'Alert', MB_OK or MB_ICONWARNING);
    end;
  end;
end;
попытка/наконец/освобождать

Код:
uses
  IdSMTP, IdMessage, IdEMailAddress;

procedure SendSimpleMail;
var
  IdSMTP: TIdSMTP;
  IdMessage: TIdMessage;
  IdEmailAddressItem: TIdEmailAddressItem;
begin
  IdSMTP := TIdSMTP.Create(nil);
  try
    IdSMTP.Host := 'smtp.gmail.com';
    IdSMTP.Port := 25;
    IdSMTP.AuthType := satDefault;
    IdSMTP.Username := 'username@gmail.com';
    IdSMTP.Password := 'password';
    IdSMTP.Connect;
    if IdSMTP.Authenticate then
    begin
      IdMessage := TIdMessage.Create(nil);
      try
        IdMessage.From.Name := 'User Name';
        IdMessage.From.Address := 'username@gmail.com';
        IdMessage.Subject := 'E-mail subject';
        IdMessage.Body.Add('E-mail body.');

        IdEmailAddressItem := IdMessage.Recipients.Add;
        IdEmailAddressItem.Address := 'recipient@email.com';

        IdSMTP.Send(IdMessage);
      finally
        IdMessage.Free;
      end;
    end;
    IdSMTP.Disconnect;
  finally
    IdSMTP.Free;
  end;
end;
beegl вне форума Ответить с цитированием
Старый 09.02.2016, 12:40   #29
Rootless
Новичок
Джуниор
 
Регистрация: 16.04.2009
Сообщений: 1
Радость SEND with indy

Цитата:
Сообщение от SkOle Посмотреть сообщение
Народ, всем ку!

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

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

Код:
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 файлов. ПРОШУ ПОМОЩИ, проект уже горит


Надо сделать connect
после отправить все письма SEND
и только потом disconnect.

А конструкция:
for 500
connect -> Залепить 1 письмо -> Dicsonnect
next
ведет к утечке памяти.
Rootless вне форума Ответить с цитированием
Старый 09.02.2016, 14:00   #30
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)некропост.
2)
Цитата:
ведет к утечке памяти.
если в этом месте утечка у инди, то так же утечка будет и в вашем способе, разве что меньше.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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