Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TBitmap ist NICHT threadsave (https://www.delphipraxis.net/189446-tbitmap-ist-nicht-threadsave.html)

Kraisel 16. Jun 2016 21:18

AW: TBitmap ist NICHT threadsave
 
Abschlusserkenntnisse:

Folgende Aussagen kann ich für XE10.1 und Firemonkey bestätigen:

So, ... und wohl nur so funktioniert es mit TBitmap im Thread einwandfrei. Passt auch zu einigen vorangegangenen Kommentaren.

1) MainTread: TBitmap.Create, dann beliebig auf dem Canvas herummalen
2) MainTread: Bitmap.Map (ReadWrite)
3) SomeThreads: Beliebig "zu Fuß" in den Buffer malen und/oder lesen. (Je Zugriff natürlich mit anderen Threads, falls vorhanden, verriegeln).
4) MainTread: Warten, bis Threads fertig sind, Bitmap.Unmap, und beliebig weiterbenutzen

Ich habe noch einmal ca. 4.5 Millionen TBitmaps (jeweils Zufallgroesse 1:1 .. 1280:800) erzeugt und im threadgetriebenen Stresstest (4 TTasks) 1.2 Tera Pixel verglichen (ca. 8 Stunden).

Das einzige, was man laut meinem Stresstest im Thread machen darf, ist auf die gemapten BitmapData lesend und schreibend zugreifen.

Alles andere macht Probleme und zwar sofort bis "fast nie". Letzteres ist TBitmap.Create/Free und/oder TBitmap.Map/Unmap im Thread. Das geht nur ca. jedes 1000 mal schief und es stimmen einzelne Pixel nicht mehr. Ein später kaum zu findener Fehler.

Harry Stahl 16. Jun 2016 22:25

AW: TBitmap ist NICHT threadsave
 
Mr. Spock würde sagen "Faszinierend". Also, mit welcher Konsequenz und Umfang Du Deine Tests hier durchziehst:thumb:.

Nur ist das so ohne ein wenig Code zu sehen leider wenig transparent und daher nicht so richtig nachvollziehbar. So ein paar Codefragmente wären schon interessant, z.B. wie Du die Maping und Unmapping Sequenzen konkret umsetzt und die Threads aufsetzt.

Du brauchst ja hier auch gar nicht Deinen ganzen Test hochladen, der vollständig kompiliert, die grundlegenden Abschnitte wo Mainthread und Einzelthreads in Konkurrenz zueinander arbeiten, das würde ja schon reichen.

Und insofern im Vergleich zu sehen, was nicht geht und was geht.

Rollo62 18. Jun 2016 11:56

AW: TBitmap ist NICHT threadsave
 
Hallo Kraisel,

sehr interesant. Es müsste mit dem map/unmap ja besser gekapselt sein als unter VCL.

Trotzdem muss ich mich Harry anschliessen, wäre gut zu wissen was genau. Z.B. auch: Läuft das unter ios Andoid osx win64 ?


Die Probleme komen ja meist wenn man sich von Win32 wegbewegt
(Hätte nie gedacht das ich sowas mal sagen würde).

Rollo


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:38 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz