Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];

Вниз

Утечка памяти   Найти похожие ветки 

 
Alik   (2009-12-02 20:38) [0]

В моей программе идет периодическая перерисовка двух объектов типа TCanvas.
Наблюдая за ОЗУ видно, как оно медленно, но верно уменьшается.

Стоит свернуть окошко программы как объем незанятого ОЗУ возвращается в первоначальное состояние.

При развертывании окошка ОЗУ снова пожирается!

Я в шоке! ))


 
Сергей М. ©   (2009-12-02 21:23) [1]


> Наблюдая за ОЗУ


Вот зачем врать, а ?


> Я в шоке


Твоё фамилиё случаем не Зверев ?)


 
Rouse_ ©   (2009-12-02 22:26) [2]


> Наблюдая за ОЗУ видно, как оно медленно, но верно уменьшается.

Сие называется мемлик. А сворачивание экрана, просто скидывает в ноль ProcessWorkSetSize из-за чего тебе кажется что как будто память "освободилась"


 
Leonid Troyanovsky ©   (2009-12-02 23:39) [3]


> Alik   (02.12.09 20:38)  

\system32\perfmon.exe
forever.

--
Regards, LVT.


 
MBo ©   (2009-12-03 08:02) [4]

Не факт, то это действительно утечка. Менеджер памяти не обязан освобождать память немедленно.
Так что лучше проверить более серьезными средствами (от ReportMemoryLeaksOnShutdown менеджера памяти  в свежих версиях Дельфи до профайлеров, если что-то и правда не в порядке)


 
Anatoly Podgoretsky ©   (2009-12-03 08:54) [5]

Пока описано нормальное поведение программы.


 
clickmaker ©   (2009-12-03 11:29) [6]

> идет периодическая перерисовка двух объектов типа TCanvas

как именно? что используется: Pen, Brush, Bitmap...?


 
Б   (2009-12-03 16:15) [7]

Наверное не удаляются вовремя GDI"ишные H-объекты.


 
Alik   (2009-12-11 21:16) [8]


> clickmaker ©   (03.12.09 11:29) [6]
> > идет периодическая перерисовка двух объектов типа TCanvas
>
> как именно? что используется: Pen, Brush, Bitmap...?


В качестве ответа на вопрос привожу кусок программы.
DrawPPIRay используется примерно 5 раз в секунду, Adjust_PPI примерно 5 раз раз минуту.

procedure TF_Radar.DrawPPIRay;
var
 X1, Y1, Ri: Integer;
 aRefl: TColor;
 aRealAz: Single;
begin
 with RadarStatus, PPI do begin
      Label_Az.Caption := IntToStr(Trunc(RealAz))          + "°";
      Label_Q.Caption  := FloatToStr( Round(RealQ*10)/10 ) + "°";

      if Anod1 or (Calibration and (StringGrid_Calibrovka.Col = 1)) then
      with Image_3cm, Canvas do begin
           Brush.Style := bsClear;
           Pen.Color := clBlack;
           Pen.Width := 1;
           Pen.Mode  := pmNotXor;
           MoveTo( X0, Y0 );
           LineTo( X2, Y2 );
           end;
      X2 := X0 + round( NR * sin(RealAz*Pi180) );
      Y2 := Y0 - round( NR * cos(RealAz*Pi180) );
      if Anod1 or (Calibration and (StringGrid_Calibrovka.Col = 1)) then
         with Image_3cm.Canvas do begin
              MoveTo( X0, Y0 ); LineTo( X2, Y2 );
              end;
      //------draw PPI rays---------------------------
      Image_3cm.Canvas.Pen.Mode  := pmCopy;
      with FileObzora do
           for Ri := 1 to NR - 5 do begin
               aRealAz := RealAz - 2;
               if aRealAz < 0 then Exit;
               X1 := X0 + round( Ri * sin(aRealAz*Pi180) );
               Y1 := Y0 - round( Ri * cos(aRealAz*Pi180) );

               if Anod1 or (Calibration and (StringGrid_Calibrovka.Col = 1)) then   begin
                  aRefl := trunc( FileObzoraCh1[CurQ, CurAz, Ri*dR-1] / 14);
                  if aRefl > Colors16 then aRefl := Colors16;
                  if (aRefl > 1) and (Anod1 or Calibration) then
                     Image_3cm.Canvas.Pixels[ X1, Y1 ] := ArrColors16[aRefl];
                  end;
               end;
      end;
end;

procedure TF_Radar.Adjust_PPI(Image: PImage; PPILabel: TLabel; Flag: Boolean);
const dCircle = 1;
begin
 with Image^, Canvas do begin
      Pen.Width   := dCircle;
      Brush.Style := bsSolid;
      if not Flag then begin
         Pen.Color := RGB(150,150,150);
         Brush.Color := ToolBar1.Color;
         FillRect(ClipRect);
         Arc(0, 0, ClientWidth, ClientHeight, ClientWidth - 10, 0, 0, ClientHeight );
         Pen.Color := clWhite;
         Arc(0, 0, ClientWidth, ClientHeight, 10, ClientHeight, ClientWidth, 0 );
         PPILabel.Visible := True;
         end
      else begin
         PPILabel.Visible := False;
         Pen.Color   := clWhite;
         Brush.Color := clWhite;
         Ellipse(dCircle, dCircle, ClientWidth - dCircle, ClientHeight - dCircle);
         end;
      end;
end;


 
Amoeba ©   (2009-12-11 22:07) [9]

1.
> procedure TF_Radar.Adjust_PPI(Image: PImage; PPILabel: TLabel; Flag: Boolean);
const dCircle = 1;
begin
with Image^, Canvas do begin

А эта хрень - указатель на указатель - нафига (объектную модель Delphi хоть знаете?)? Не надо так делать! Можно хорошо получить граблями по лбу.

В остальном же в пределах представленного кода ничего, что может вызвать утечки памяти, не видно.

2.
> Наблюдая за ОЗУ видно, как оно медленно, но верно уменьшается.
>
> Стоит свернуть окошко программы как объем незанятого ОЗУ
> возвращается в первоначальное состояние.
>
> При развертывании окошка ОЗУ снова пожирается!

Таким путем утечки памяти не диагностируются. Для этого используетсяспециальный инструментарий: MemProof, FastMM.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.003 c
2-1259683014
Evgnevius
2009-12-01 18:56
2010.02.07
Вывода битмапа по маске и под углом


15-1259667219
Marser
2009-12-01 14:33
2010.02.07
Утилита для работы с XML


15-1259875013
AlexDan
2009-12-04 00:16
2010.02.07
Стиль W7 и стандартные компоненты..


15-1259789646
AlexDan
2009-12-03 00:34
2010.02.07
Переходить ли на W7.. продолжение..


4-1228473351
Nucer
2008-12-05 13:35
2010.02.07
Перехват WM_LBUTTONDOWN в конкретном приложении





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский