Hallo Marabu,
Ich hab jetzt mal die Funktion so angepasst:
Delphi-Quellcode:
procedure TMJPEGThread.GenerateBitmap;
var
JPEGImage: TJPEGImage;
begin
JPEGImage := TJPEGImage.Create;
try
JPEGImage.LoadFromStream(FAktImg);
JPEGImage.Performance := jpBestSpeed;
FBitmap.Assign(JPEGImage);
ImgReady(FBitmap);
finally
FBitmap.Dormant;
FBitmap.FreeImage;
FBitmap.ReleaseHandle;
JPEGImage.Free
end;
end;
MemProof meldet das gleiche Problem noch in der Funktion ImgReady und zwar beim Aufruf eines Events, dem diese Funktion zugewiesen ist:
Delphi-Quellcode:
procedure TAnzeige.OnImage(Sender: TObject; _Img: TBitmap);
begin
if Assigned(FCritSect)
then begin
FCritSect.Acquire;
try
if not FLocked
then begin
if not FBitmap.Empty
then begin
FBitmap.Dormant;
// Free up GDI resources
FBitmap.FreeImage;
// Free up Memory. (not really needed)
FBitmap.ReleaseHandle;
// This will actually lose the bitmap (not needed)
end;
FBitmap.Assign(_Img);
end;
finally
FCritSect.Leave;
end;
if GetTickCount >= (FLastImgRefresh + FMinImgRefresh)
then begin
//PostMessage(self.Handle, WM_PAINT, 0, 0);
FFestImgReady := true;
(sender
as TImgThread).DoSynchronize(pbImg.Invalidate);
FLastImgRefresh := GetTickCount;
end;
end;
end;
Weil FBitmap das OffScreen-Bitmap für eine PaintBox ist, kann ich Dormant und Co. erst vor dem nächsten Zuweisen aufrufen.
MemProof zeigt mir übrigens immer jeweils einen Fehler beim Aufruf von GenerateBitmap und einen beim Aufruf dieses Events an.
[Nachtrag zum Posting von Muetze]
Heißt das für mich, ich sollte einfach mit FreeImage und ReleaseHandle aufräumen?