Форум: "Начинающим";
Текущий архив: 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