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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2010, 21:52   #1
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Вроде всё освобождаю, но занятая память всё увеличивается и увеличивается...

Во втором сообщении выложу кусок кода...

Код:
procedure TForm1.TCPExecute(AContext: TIdContext);
var
  msg: Byte;
  mm: TMemoryStream;
  size: Int64;
  bmp: TBitmap;
begin
  msg:=AContext.Connection.IOHandler.ReadByte;

  if msg=PCM_SendingDC then
  begin
    mm:=TMemoryStream.Create;
    size:=AContext.Connection.IOHandler.ReadInt64();
    AContext.Connection.IOHandler.ReadStream(mm, size);
    mm.Position:=0;
    bmp:=TBitmap.Create;
    bmp.LoadFromStream(mm);

    frmScreen.bmp.Assign(bmp);
    Form3.Canvas.CopyRect(Form3.Canvas.ClipRect, bmp.Canvas, bmp.Canvas.ClipRect);
    Form3.Show;
    bmp.Free;
    mm.Free;
  end;
end;

procedure TForm1.TCPConnect(AContext: TIdContext);
var
  t: TDateTime;
begin
  t:=now;
    ListBox1.Items.Insert(0, FormatDateTime('[hh:mm] ', t)+AContext.Connection.Socket.Binding.PeerIP+' connected');
  ListBox1.ItemIndex:=0;
  connected:=true;
  usr:=AContext.Connection;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if connected then
  begin
    usr.IoHandler.Write(PCM_NeedDC);
  end
  else
  begin
    ShowMessage('Not Connected');
  end;
end;
А вот frmScreen:
Код:
var
  Form3: TForm3;
  bmp: TBitmap;

implementation

{$R *.dfm}

procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Hide;
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  bmp:=TBitmap.Create;
end;

procedure TForm3.FormPaint(Sender: TObject);
begin
  Canvas.CopyRect(Canvas.ClipRect, bmp.Canvas, bmp.Canvas.ClipRect);
end;

procedure TForm3.FormResize(Sender: TObject);
begin
  Self.Canvas.CopyRect(Canvas.ClipRect, bmp.Canvas, bmp.Canvas.ClipRect);
end;
В кратце: первой части я получаю поток, из него гружу картинку в frmScreen. Если много раз потыкать на Button, то память будет увеличиваеться и увеличиваться.

У нас принято пользоваться кнопочкой "Правка", дабы не плодить посты подряд, друг за другом.
Читаем правила. Рекомендую. Помимо общих правил форума есть и дополнения к ним в каждом разделе...
Уважайте форумчан, и они ответят вам взаимностью...
Модератор


Mihali4, я специально выложил код программы во втором посте, т.к. первый не редактируется. А кнопочкой правка я всегда пользуюсь.

Последний раз редактировалось TwiX; 01.03.2010 в 22:22.
TwiX вне форума Ответить с цитированием
Старый 01.03.2010, 22:00   #2
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

А ты освобождай каждый раз память

Код:
uses Windows, SysUtils;

procedure TrimWorkingSet;
var
  MainHandle: THandle;
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then 
  begin
    MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID);
    SetProcessWorkingSetSize(MainHandle, DWORD(-1), DWORD(-1));
    CloseHandle(MainHandle);
  end;
end;
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 01.03.2010, 22:34   #3
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Ммм... А это нормально?
Эту процедуру пихнуть в таймер или куда? Ведь мне нужно, что бы bmp в frmScreen не освобождалось.
TwiX вне форума Ответить с цитированием
Старый 01.03.2010, 23:44   #4
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

Цитата:
Сообщение от TwiX Посмотреть сообщение
Если много раз потыкать на Button, то память будет увеличиваеться и увеличиваться.
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
 if connected then
  begin
    usr.IoHandler.Write(PCM_NeedDC);
    TrimWorkingSet;
  end
  else
  begin
    ShowMessage('Not Connected');
  end;
end;

procedure TForm1.TrimWorkingSet;
var
  MainHandle: THandle;
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then 
  begin
    MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID);
    SetProcessWorkingSetSize(MainHandle, DWORD(-1), DWORD(-1));
    CloseHandle(MainHandle);
  end;
end;
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 02.03.2010, 00:08   #5
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Хехе) Работает)
Спасибо)
А всё-таки, куда может утекать память?

Добавлено:
А что фактически делает эта функция? Если у меня была допусим bmp: TBitMap, то после функции с ней станет по сути bmp.free?
TwiX вне форума Ответить с цитированием
Старый 02.03.2010, 01:10   #6
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

Эта функция освобождает неиспользуюмую память, кстати очень полезная функция, как именно работает не знаю
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 02.03.2010, 03:10   #7
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Вызов функции с такими параметрами просто-напросто сбросит данные в своп, аналогично вызову EmptyWorkingSet. Такие гадости имеет смысл делать только если ожидается простой приложения или работа в фоновом режиме, в остальных случаях вмешиваться в работу менеджера памяти не желательно - можно сильно угробить производительность
пыщь
JTG вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
куда-то девается трафик ACE Valery Свободное общение 12 07.10.2009 09:55
А куда лучше поступать? leomas Свободное общение 21 05.09.2009 06:57
Не пойму куда вбивать JRcoker Общие вопросы Delphi 0 04.10.2008 02:11
Куда поступать...? Timofei Свободное общение 3 19.06.2008 13:15