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

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

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

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

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

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

>> Наоборот надо.
не дало результатов, тоже самое
SkOle вне форума Ответить с цитированием
Старый 28.01.2013, 09:18   #12
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

ИМХО без прохода отладчиком не разобраться. Я криминала в представленном коде не вижу.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.01.2013, 09:24   #13
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Значит наоборот не надо Там всё нормально.
А сколько утекает и как быстро?
ИМХО, это особенности системы, она так организует работу с памятью. Вот если окно свернуть, то диспетчер покажет увеличение свободной памяти, а если восстановить, то наоборот. Но это вовсе не значит, что при сворачивании окно уничтожается. Просто система оптимизирует свою память. А при многократных запусках сторонней программы система это не делает (и правильно что не делает), а вот как только эта оптимизация понадобится, то диспетчер покажет нам, что память "освободилась".
Так что соглашусь со Стилетом, что диспетчер не доказательство (если конечно рост памяти не идёт постоянно). Прогнал этот алгоритм по 1000 раз. В итоге никаких отклонений не наблюдалось.
eoln вне форума Ответить с цитированием
Старый 28.01.2013, 11:07   #14
SkOle
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 29
По умолчанию

Алгоритм создания процесса действительно был почти без косяков... утечку давало StringToOleStr для перевода в PWideChar... + изменение места включения таймера
Код:
if FindFiles(DirectoryTemp, FileMaskList.Strings[FileMaskCount],
      FileList) then
      try
        for FileCount := 0 to FileList.Count - 1 do
        begin
          FileName := ExtractFileName(FileList.Strings[FileCount]);

          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 + ' ' +
            CryptorParamIn + '"' + DirectoryTemp + FileName + '"')),
            nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
            nil, nil, StartupInfo, ProcessInfo);

          while WaitForSingleObject(ProcessInfo.hProcess, 100) = WAIT_TIMEOUT do
          begin
            Application.ProcessMessages;
            TimerHook.Enabled := True;
          end;

          GetExitCodeProcess(ProcessInfo.hProcess, ResultCode);
          CloseHandle(ProcessInfo.hProcess);
          CloseHandle(ProcessInfo.hThread);
      finally
        FileName := '';
        FileList.Clear;
      end;
Код:
function FindFiles(Directory, FileName: string; FileList: TStringList): Boolean;
var
  SearchRec: TSearchRec;
  SearchCount: Integer;
begin
  Result := False;
  Directory := IncludeTrailingBackslash(Directory);
  SearchCount := FindFirst(Directory + '*.*', faAnyFile, SearchRec);
  FileList.Clear;
  try
    while SearchCount = 0 do
      begin
        if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
          if MatchesMask(SearchRec.Name, FileName) then
            FileList.Add(Directory + SearchRec.Name);
        SearchCount := FindNext(SearchRec);
      end;
  finally
    FindClose(SearchRec);
    if FileList.Count > 0 then
      Result := True;
  end;
end;
Код:
procedure TFormMain.TimerHookTimer(Sender: TObject);
var
  hWind: THandle;
  hEdit: THandle;
  hButton: THandle;
begin
  hWind := FindWindow(nil, 'Пароль для расшифрования ключа');
  if hWind <> 0 then
    try
      TimerHook.Enabled := False;
      hEdit := FindWindowEx(hWind, 0, nil, '');
      if hEdit <> 0 then
        begin
          SendMessage(hEdit, WM_SETTEXT, 0, LParam(CryptorPassword));
          CloseHandle(hEdit);
        end;
      hButton := FindWindowEx(hWind, 0, nil, 'OK');
      if hButton <> 0 then
        begin
          SendMessage(hButton, BM_CLICK, 0, 0);
          CloseHandle(hButton);
        end;
    finally
      CloseHandle(hWind);
    end;
end;
Может кому понадобиться... запуск процесса с ожиданием выполненния + таймер отлова окна с предложением ввести пароль и автоматизация последнего

P.S. сорри за стиль, я сисадмин, а не программер

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

Цитата:
Значит наоборот не надо Там всё нормально.
Нет, не нормально.
Сначало закрывается hThread потом hProcess. Почитайте о том, что такое процесс и как работает CreateProcess изнутри.
Утечка возникает на уровне ядра.
Подключите EurekaLog или MadExcept, создайте поток TThread и не уничтожая его, закройте программу. Сразу получите ругательство в сторону утери памяти занятой под поток.

И эти handle'ы должны быть 100% закрыты. ТС поместите их закрытие в Finally.

Последний раз редактировалось Человек_Борща; 28.01.2013 в 14:06.
Человек_Борща вне форума Ответить с цитированием
Старый 28.01.2013, 14:24   #16
SkOle
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 29
По умолчанию

>> И эти handle'ы должны быть 100% закрыты. ТС поместите их закрытие в Finally.
Спсб, исправил...

А вот что делать с погаными Indy?
SkOle вне форума Ответить с цитированием
Старый 28.01.2013, 14:34   #17
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Научится пользоваться. Если что-то работает не так как вам надо - это вовсе не значит что оно неисправно, может вы просто не умеете пользоваться?

Пакет компонент хороший и мощный, очень мощный. Однако тяжеловесный. Там нет ошибок памяти, по крайней мере в тех компонентах, которыми я пользовался(HTTP, TCP, FTP). Там нету рутинной работы.

Попробуйте Synapse или Overbyte ICS.
Человек_Борща вне форума Ответить с цитированием
Старый 28.01.2013, 14:51   #18
SkOle
Пользователь
 
Регистрация: 18.01.2009
Сообщений: 29
По умолчанию

>> Попробуйте Synapse или Overbyte ICS.
Смотрел их, Synapse тоже покушивает память при smtpsend.SendToRaw, а причем код был взят один в один с примера...

Если бы разовая была операция, то фиг с ним с памятью, у меня задача стоит на ежедневную обработку 500-700 файлов...
SkOle вне форума Ответить с цитированием
Старый 28.01.2013, 15:01   #19
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Использовал INDY и Synapse для массовой рассылки писем. 500 писем, для теста, не создавали проблем. Ошибки скорее всего вы создаете, а не не средства которые вы используете. Смотрите инструкцию, следите за типами данных, особенно преобразованием и хранением строк.

Последний раз редактировалось Человек_Борща; 28.01.2013 в 15:03.
Человек_Борща вне форума Ответить с цитированием
Старый 28.01.2013, 15:19   #20
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Нет, не нормально.
Майкрософты плохого не посоветуют: http://msdn.microsoft.com/ru-ru/libr...(v=vs.85).aspx
В случаем запусков потоков из потоков можно закрыть хэндл потока, а потом хэндл процесс для экономии памяти. А тут разницы нет, т.к. поток уже отработал и ничего более за собой не тащит.
eoln вне форума Ответить с цитированием
Ответ


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