Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.07.2012, 12:54
lestatgi lestatgi вне форума
Прохожий
 
Регистрация: 07.06.2010
Сообщения: 32
Репутация: 10
По умолчанию контроль утечек памяти

возникла проблема, мне необходимо что бы timer1 выполнялся каждые 10 секунд interval=10000 и в on timer было следующее
Код:
ShellExecute(Handle, nil, 'cmd.exe', '/c '+ 'net session >c:\1.txt', nil, SW_HIDE);
sleep(1000);
  ls:=TStringList.Create;
  ls.LoadFromFile('c:\1.txt');
  d:=DosToWin(ls.Text);
  ls.Clear;
  ls.Add(d);
  ls.SaveToFile('c:\1.txt');
  ls.Free;
все работает но проблема в следующем программа весит в трее и постепенно кушает память если долго работает то система начинает сильно тормазить. как этого избежать?
Ответить с цитированием
  #2  
Старый 12.07.2012, 13:30
Аватар для ~TB~
~TB~ ~TB~ вне форума
Начинающий
 
Регистрация: 17.02.2006
Адрес: Казахстан
Сообщения: 172
Версия Delphi: XE
Репутация: 1500
По умолчанию

ls можно создать вне таймера для оптимизации, при запуске программы например onCreate, уничтожать по завершению, например на onClose или как там его. Но сама беда с памятью непонятна. Вроде как все чистенько. Возможно утечка где-то еще, например в DosToWin.
__________________
00110001 00101100 00110110 00110001 00111000 00110000 00110011 00110011 00111001 00111000 00111000 00110111 00110100 00111001 00111000 00111001 00110100 00111000 00110100 00111000 00110010 00110000 00110100 00110101 00111000 00110110 00111000 00110011 00110100 00110011 00110110 00110101 00110110
Ответить с цитированием
  #3  
Старый 12.07.2012, 14:44
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

Знаю, что такая проблема на делфи 7 есть. Вроде как и пишешь, что "что-то".free, а память не освобождается. А когда снова создаёшь, то память отнимается тоже вновь. Так и растёт.
Ответить с цитированием
  #4  
Старый 12.07.2012, 14:49
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Смех

Цитата:
Сообщение от R-18Rus
Знаю
Выдумываешь. Дай минимальный проект воспроизводящий это?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 12.07.2012, 15:01
U.B.M. U.B.M. вне форума
Новичок
 
Регистрация: 06.10.2011
Сообщения: 94
Версия Delphi: Delphi 7
Репутация: 13
По умолчанию

а если не секрет - почему после загрузки делается dostowin, а перед записью wintodos не делается?

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

либо излишнее в коде, либо недостаточно в плане перекодировки
Ответить с цитированием
  #6  
Старый 12.07.2012, 15:21
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
Смех

Цитата:
Сообщение от NumLock
Выдумываешь. Дай минимальный проект воспроизводящий это?
Код:
type
  TFoo = class
  public
    procedure Free; reintroduce;
  end;

procedure TFoo.Free;
begin
  GetMem($100500);
end;


P.S. Подсветчик синтаксисане не подсветил ключевое слово "reintroduce", как-то не красиво.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
~TB~ (12.07.2012)
  #7  
Старый 12.07.2012, 15:46
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ну так опять-таки косяк разработчика, а не Delphi. подсветка это всего лишь сладкая французкая булочка к чаю)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #8  
Старый 12.07.2012, 19:24
Аватар для @Rafa3L
@Rafa3L @Rafa3L вне форума
Начинающий
 
Регистрация: 09.11.2011
Адрес: Москва
Сообщения: 144
Версия Delphi: XE2
Репутация: 11216
По умолчанию

Закинь сюда урезанный рабочий код - посмотрю, попытаюсь оптимизировать.
__________________
Помогаю платно.
Помогаю иногда бесплатно.
Ответить с цитированием
  #9  
Старый 13.07.2012, 08:07
lestatgi lestatgi вне форума
Прохожий
 
Регистрация: 07.06.2010
Сообщения: 32
Репутация: 10
По умолчанию

Код:
unit Unit1;

interface

uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShellApi, StdCtrls, ExtCtrls;


type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  ls:TStringList;
  d:string;
implementation

{$R *.dfm}
 function DosToWin(St: string): string;
var
  Ch: PChar;
begin
  Ch := StrAlloc(Length(St) + 1);
  OemToAnsi(PChar(St), Ch);
  Result := Ch;
  StrDispose(Ch)
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 ShellExecute(Handle, nil, 'cmd.exe', '/c '+ 'net session >c:\1.txt', nil, SW_HIDE);
 sleep(1000);
 ls:=TStringList.Create;
 ls.LoadFromFile('c:\1.txt');
 d:=DosToWin(ls.Text);
 ls.Clear;
 ls.Add(d);
 ls.SaveToFile('c:\1.txt');
 ls.Free;


end;

end.
Ответить с цитированием
  #10  
Старый 13.07.2012, 08:51
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

используй CreateProcess вместо ShellExecute:
Код:
var
  startupinfo: TStartupInfo;
  processinformation: TProcessInformation;
  ls: TStringList;
begin
  ZeroMemory(@processinformation, SizeOf(TProcessInformation));
  ZeroMemory(@startupinfo, SizeOf(TStartupInfo));
  startupinfo.cb:=SizeOf(TStartupInfo);
  startupinfo.dwFlags:=STARTF_USESHOWWINDOW;
  startupinfo.wShowWindow:=SW_HIDE;
  CreateProcess(nil, 'cmd.exe /c net session >c:\1.txt', nil, nil, False, 0, nil, nil, startupinfo, processinformation);
  WaitForSingleObject(processinformation.hProcess, INFINITE);
  CloseHandle(processinformation.hThread);
  CloseHandle(processinformation.hProcess);
  ls:=TStringList.Create;
  try
    ls.LoadFromFile('c:\1.txt');
    ls.Text:=DosToWin(ls.Text);
    ls.SaveToFile('c:\1.txt');
  finally
    ls.Free;
  end;
end;
ShellExecute вызывает утечку.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо NumLock за это полезное сообщение:
lestatgi (13.07.2012), nixel (30.07.2012)
  #11  
Старый 13.07.2012, 08:51
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

Цитата:
Сообщение от NumLock
Выдумываешь. Дай минимальный проект воспроизводящий это?

Вот держи.
Вложения
Тип файла: rar Forms.rar (173.8 Кбайт, 4 просмотров)
Ответить с цитированием
  #12  
Старый 13.07.2012, 08:53
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Желательно так делать
Код:
function DosToWin(St: string): string;
var
  Ch: PChar;
begin
  Ch := StrAlloc(Length(St) + 1);
  try
    OemToAnsi(PChar(St), Ch);
    Result := Ch;
  finally
    StrDispose(Ch)
  end;
end;

З.Ы. вот это скорость, пока писал 2 поста влепили
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #13  
Старый 13.07.2012, 09:16
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
При открытии этой формы съедается немного памяти. При закрытии память не освобождается. При повторном открытии память съедается повторно. Проверено на Windows XP SP3. На Windows XP SP2 x64 ведёт себя по-разному, не предсказуемо.
ничего подобного с Delphi 7 Windows XP SP3 нет! для еще большей наглядности на 2-ую форму добавил bmp 1280*1024*24b. при вызове ее память процесса увеличивается на 4Мб. при закрытии освобождается на эти же 4Мб. видео лень снимать)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #14  
Старый 13.07.2012, 09:16
lestatgi lestatgi вне форума
Прохожий
 
Регистрация: 07.06.2010
Сообщения: 32
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
используй CreateProcess вместо ShellExecute:
Код:
var
  startupinfo: TStartupInfo;
  processinformation: TProcessInformation;
  ls: TStringList;
begin
  ZeroMemory(@processinformation, SizeOf(TProcessInformation));
  ZeroMemory(@startupinfo, SizeOf(TStartupInfo));
  startupinfo.cb:=SizeOf(TStartupInfo);
  startupinfo.dwFlags:=STARTF_USESHOWWINDOW;
  startupinfo.wShowWindow:=SW_HIDE;
  CreateProcess(nil, 'cmd.exe /c net session >c:\1.txt', nil, nil, False, 0, nil, nil, startupinfo, processinformation);
  WaitForSingleObject(processinformation.hProcess, INFINITE);
  CloseHandle(processinformation.hThread);
  CloseHandle(processinformation.hProcess);
  ls:=TStringList.Create;
  try
    ls.LoadFromFile('c:\1.txt');
    ls.Text:=DosToWin(ls.Text);
    ls.SaveToFile('c:\1.txt');
  finally
    ls.Free;
  end;
end;
ShellExecute вызывает утечку.
спасибо помогло.
Ответить с цитированием
  #15  
Старый 13.07.2012, 09:44
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Цитата:
Сообщение от R-18Rus
Вот держи.

Проверил на Win7 x64 (компилятор от XE) - безконтрольного увеличения памяти не увидел.

Однако так писать нельзя, ИМХО.

Зачем создавать форму если она у тебя в Auto-create?
Что по сути происходит в данном проекте:
- есть переменная form2, она "связана" с автоматически созданной формой (форма создана при старте проекта).
- по нажатию кнопки ты создаешь новую форму и "связываешь" ее с переменной form2 (под это выделяется память, видим прирост памяти в диспетчере задач), получается что на экземпляр второй формы который был создан при старте приложения уже не указывает никакая переменная - это называется утечка памяти, но в данном случае проблема не в delphi, а в криворукости программиста.
- затем ты делаешь free для второй формы, переменная form2 уже никуда не указывает, память помечается как свободная (но не отдается обратно системе, это не бага это фича), и при повторном нажатии на кнопку форма заново создается, память выделяется (т.к. есть свободная то у системы больше не просим, и в дипетчере задач изменения объема памяти не наблюдается).

Вот так-то.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:59.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter