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?