아 이문제 때문에 고생고생 했는데 결국은 잡았다.... 해방된 기분
이 문제는 TBitmap32에 비트맵(TBitmap) 기반 Assign하는 동작이 스레드 내에서 안전하지 않기 때문으로
증상은 할당후 여타 작업을 수행 후에 TBitmap 객체를 해제 해도 메모리에서 제거되지 않는 문제임.
이 메모리 누수 현상은 유레카 로그에서도 메모리 릭으로 검출되지 않음.
해결책은 다음과 같습니다.
GR32.pas 소스를 수정해야 함
procedure TCustomBitmap32.Assign(Source: TPersistent); 함수내에 서브 함수중 Bitmap을 이용한 Assign 부분을 수정
이 문제는 TBitmap32에 비트맵(TBitmap) 기반 Assign하는 동작이 스레드 내에서 안전하지 않기 때문으로
증상은 할당후 여타 작업을 수행 후에 TBitmap 객체를 해제 해도 메모리에서 제거되지 않는 문제임.
이 메모리 누수 현상은 유레카 로그에서도 메모리 릭으로 검출되지 않음.
해결책은 다음과 같습니다.
GR32.pas 소스를 수정해야 함
procedure TCustomBitmap32.Assign(Source: TPersistent); 함수내에 서브 함수중 Bitmap을 이용한 Assign 부분을 수정
procedure AssignFromBitmap(TargetBitmap: TCustomBitmap32; SrcBmp: TBitmap); var TransparentColor: TColor32; DstP: PColor32; I: integer; DstColor: TColor32; begin SrcBmp.Canvas.Lock; //-- Add by niceondal for memory leaks in Thread AssignFromGraphicPlain(TargetBitmap, SrcBmp, 0, SrcBmp.PixelFormat <> pf32bit); if TargetBitmap.Empty then Exit; if SrcBmp.Transparent then begin TransparentColor := Color32(SrcBmp.TransparentColor) and $00FFFFFF; DstP := @TargetBitmap.Bits[0]; for I := 0 to TargetBitmap.Width * TargetBitmap.Height - 1 do begin DstColor := DstP^ and $00FFFFFF; if DstColor = TransparentColor then DstP^ := DstColor; Inc(DstP); end; end; if Supports(TargetBitmap.Backend, IFontSupport) then // this is optional (TargetBitmap.Backend as IFontSupport).Font.Assign(SrcBmp.Canvas.Font); SrcBmp.Canvas.UnLock; //-- Add by niceondal for memory leaks in Thread end;
'프로그래밍 > Delphi' 카테고리의 다른 글
[Delphi] 듀얼 모니터 인식 및 사용하기 (0) | 2011.10.11 |
---|---|
DrawText를 이용한 WrapedText의 높이 구하기 (0) | 2011.08.01 |
Graphics32에서 TBitmap32를 Thread 내에서 사용했을때의 문제점 추정 (0) | 2011.07.24 |
GDI객체 및 기본 윈도우 메모리 힙 할당문제 (1) | 2011.07.23 |
JPEG/GIF/BMP/PNG/PCX등 이미지 관련 정보를 간단히 얻기 (0) | 2011.07.21 |