Hallo,
ich wende mich wieder mal mit einem Fehler an Euch, auf dessen Schliche ich nicht komme...
Ich habe einen Thread, der einen "Bild" auf ein Bitmap zeichnen soll.
Dieses Bitmap soll dann in der
GUI in einem Image angezeigt werden
Delphi-Quellcode:
type TDisplayHandler = class(TThread)
[...]
constructor TDisplayHandler.Create(_createSuspended : Boolean);
begin
FBitmap := TBitmap.Create;
[...]
end;
destructor TDisplayHandler.Destroy;
begin
FreeAndNil(FBitmap);
[...]
end;
procedure TDisplayHandler.DisplayBitmap(_data : TObjectList<TTorqueData>);
//-> wird von einem Timer regelmäßig aufgerufen
begin
FData := _Data;
if FIsDone then //Graph wurde fertig berechnet, neuer kann berechnet werden
FIsDone := False;
end;
procedure TDisplayHandler.SyncEvent;
begin
// if Assigned(FBitmapChangeEvent) then
// FBitmapChangeEvent(FBitmap);
//eigentlich so, aber dahinter steht effektiv auch nur ein:
frmMain.Image.Picture.Assign(FBitmap);
end;
procedure TDisplayHandler.Execute;
begin
while not Terminated do
begin
if not FIsDone then
begin
DoCreate;
Synchronize(SyncEvent);
FIsDone := True;
end
else
Sleep(20);
end;
end;
end.
Nach einiger Zeit, jedoch unterschiedlich, mal 10 mal 100 Timeraufrufe später, bricht er ab mit
Code:
Project Torque.exe raised
exception class EOutOfResources with message 'Out of system resources'.
Der Cursor hängt dann in der Methode
DoCreate
und zwar dort an der ersten Stelle, an der ich auf das Bitmap zugreifen will
Delphi-Quellcode:
procedure TDisplayTorqueOverTime.DoCreate;
begin
[...]
clearBitmap(FBitmap);
drawLine(0, FXAxisPos, FWidth, FXAxisPos, clBlack, 3, FBitmap.Canvas); //hier hängt der Cursor
drawLine(FYAxisPos, 0, FYAxisPos, FHeight, clBlack, 3, FBitmap.Canvas);
[...]
//mit
procedure clearBitmap(_bitmap : TBitmap);
//-> überzeichnet das Canvas des angegebenen Bitmaps weiß
var t_brush : TBrush;
begin
if Assigned(_bitmap) then
begin
t_brush := Tbrush.Create;
t_brush.Assign(_bitmap.Canvas.Brush);
_bitmap.Canvas.Brush.Color := clWhite;
_bitmap.Canvas.Brush.Style := bsSolid;
_bitmap.Canvas.FillRect(Rect(0, 0, _bitmap.Width, _bitmap.Height));
_bitmap.Canvas.Brush.Assign(t_brush);
t_brush.Free;
end;
end;
procedure drawLine(_x1, _y1, _x2, _y2 : Integer; _color : TColor; _width : Integer; _canvas : TCanvas);
//-> zeichnet im angegebenen Canvas eine Linie
//-> Pen wird dabei nicht verändert, da er zwischengespeichert wird
var t_pen : TPen;
begin
if Assigned(_canvas) then
begin
t_pen := TPen.Create;
t_pen.Assign(_canvas.Pen);
_canvas.Pen.Color := _color;
_canvas.Pen.Width := _width;
_canvas.MoveTo(_x1, _y1);
_canvas.LineTo(_x2, _y2);
_canvas.Pen.Assign(t_pen);
t_pen.Free;
end;
end;
Ich finde meinen Fehler nicht, denn FBitmap wird ja nur einmal erstellt undd er Zugriff auf die
GUI wird synchronisiert. Oder mache ich einen kapitalen Denkfehler (wäre nicht das erste Mal)?
Für Hilfe wäre ich wie immer immens dankbar...