Einzelnen Beitrag anzeigen

silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#1

EOutOfResource + Thread + Bitmap + Assign

  Alt 3. Mär 2013, 11:30
Delphi-Version: XE
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...
Tobias
Bitte nicht hauen , ich weiß es nicht besser

Geändert von silver-moon-2000 ( 3. Mär 2013 um 11:31 Uhr) Grund: falsche Delphi Version angegeben
  Mit Zitat antworten Zitat