Registriert seit: 2. Apr 2004
Ort: Bonn
2.533 Beiträge
Delphi 11 Alexandria
|
AW: FMX-TBitmap: Nach Gebrauch von Canvas ins threads unbrauchbar?
10. Nov 2020, 23:15
Ich hatte Dein ursprüngliches Beispiel mal getestet und kann insofern die Probleme (insbesondere unter Android) bestätigen. Hatte auch festgestellt, dass die Pointer-Drehvariante eher Probleme erzeugt, als die simple Version. Ich hatte dann noch versucht es ein wenig zu optimieren (z.B. potentielle Kollisionen mit entsprechendem Auslassen von Zugriffen auf das Bitmap zu vermeiden, indem ich auf versucht habe, auf entsprechende Rückgaben von Beginsceene oder Map zu reagieren (die liefern ja ein Boolean zurück, ob ein Zugriff möglich ist oder nicht). Auch hatte ich statt Synchronize "Queue" bzw. "ForceQueue" verwendet, um den Eintritt in den Hauptthread ein wenig nach hinten zu verzögern. Ich hatte damit zwar eine "Erfolgsquote" von ca. 60-80% unter Android aber eben nicht 100% und ich konnte nicht wirklich irgendwelche Kollisionen registrieren.
Ich habe leider keine Ahnung wo das Problem genau liegt.
Mit Delhi 10.2 kam ja die Information, dass TBitmap, TCanvas und Tcontext 3D threadsicher gemacht worden seien man aber die Zugriffsweise auf diese Ressourcen etwas ändern sollte (hatte ich in meinem Buch für den Zugriff auf TCanvas beschrieben). Die Erläuterung war, dass die Zugriffe intern serialisiert werden und in eine Warteschlange kommen.
Wenn ich mir den Code in FMX.Graphics und FMX.Canvas.D2D etc. so ansehe (was sehr schwierig ist, da die entscheidenen Prozeduren virtuelle Prozeduren sind und je nach Plattform oft andere Units aufgerufen werden, man kommt also an den tatsächlichen Ablauf nur ran, wenn man debugt, was aber in einem System, das Event- und Messagebasiert arbeitet auch nicht immer möglich ist), habe ich aber den Eindruck, als ob ein Schutz nur gegeben ist, für mehrere Zugriffe auf TCanvas (Beginscene) oder TBitmap (Content) per Map aber der Mix dererlei Zugriffe eben nicht. Aber das ist eher eine Vermutung, als dass ich es wirklich beweisen könnte.
Diese Erklärung könnte aber durchaus mit Deiner Lösung zusammenpassen, da Du ja eine temporäre Bitmap erzeugst und deren Canvas manipulierst und dann den ganzen Content in die eigentliche Bitmap rüberkopierst. Und in CopyBitmap wird auch TMonitor verwendet, was auch in Map verwendet wird, so scheint also die Resource bei diesem Verfahren insgesamt schützbar zu sein.
Geändert von Harry Stahl (10. Nov 2020 um 23:25 Uhr)
|