Einzelnen Beitrag anzeigen

Benutzerbild von Sherlock
Sherlock
Online

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.763 Beiträge
 
Delphi 11 Alexandria
 
#1

Multithreaded Zeichnen

  Alt 2. Jul 2018, 08:00
Ich versuche die Zeit zu verkürzen, die meine Applikation einfriert, wenn ich zeichne. Da ab Tokyo Bitmaps threadsicher sein sollen, habe ich das zeichnen auf die Bitmap in einen Thread ausgelagert und möchte die fertige Bitmap per Synchonize an die GUI übergeben. Unter Windows klappt das einwandfrei, mit dem iOS Simulator ebenso. Auf dem iDevice hingegen gar nicht. Ich habe dazu ein kleines Testprojekt gebaut, daß in per Button einen Thread startet, der auf einer Bitmap tausend zufällige Punkte mit einer Linie verbindet und dann das Ergebnis in ein Image auf der Oberfläche setzt. Das habe ich probiert per direkter Zuweisung, per Assign und CopyFromBitmap. Nichts führte zu einem sichtbaren Ergebnis.

Hier die relevanten Methoden:
Delphi-Quellcode:
procedure TPainter.Execute;
var
  myPoint1 : TPoint;
  myPoint2 : TPoint;
  i : integer;
  service : IFMXPhotoLibrary;
begin
  inherited;
  while not Terminated do
  begin
    myPoint1 := TPoint.Zero;
    if fBMP.Canvas.BeginScene then
    begin
      fBMP.Canvas.Clear(TAlphaColorRec.Null);
      fBMP.Canvas.Stroke.Thickness := 1;
      fBMP.Canvas.Stroke.Color := TAlphaColorRec.Black;
      try
        for i := 0 to 1000 do
        begin
          myPoint2 := TPoint.Create(Random(fBMP.Width), Random(fBMP.Height));
          fBMP.Canvas.DrawLine(myPoint1, myPoint2, 1);
          myPoint1 := myPoint2;
        end;
      finally
        fBMP.Canvas.EndScene;
      end;
    end;
    Synchronize(updateGui);
    Sleep(1000);
  end;
end;
Und die synchronisierte Methode:
Delphi-Quellcode:
procedure TPainter.updateGui;
begin
  Form16.Image1.BeginUpdate;
  Form16.Image1.Bitmap.SetSize(fBMP.Size);
  Form16.Image1.Bitmap.Assign(fBMP);
  Form16.Image1.EndUpdate;
  Form16.Image1.Repaint;
end;
Im Ergebnis sollte eine Bitmap mit wildem Zickzack einmal pro Sekunde neu gezeichnet werden.

Was mache ich falsch?
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat