AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TBitmap ist NICHT threadsave

Ein Thema von Kraisel · begonnen am 13. Jun 2016 · letzter Beitrag vom 18. Jun 2016
Antwort Antwort
Seite 1 von 3  1 23   
Benutzerbild von Kraisel
Kraisel

Registriert seit: 19. Mär 2012
Ort: Bochum-Linden
64 Beiträge
 
Delphi 12 Athens
 
#1

TBitmap ist NICHT threadsave

  Alt 13. Jun 2016, 22:13
Hallo Zusammen,

dies ist keine Frage, sondern nur eine getestete Aussage. Denn immer mal wieder tritt die Frage auf, ob TBitmap threadsave ist oder nicht. Wie viele andere Kollegen auch, war ich der Meinung, dass man durchaus mit Map/Unmap in einem Thread wenigstens aus der Bmp lesen kann. Aber selbst das geht manchmal schief und es werden falsche Pixel gelesen. Ob hier ein falscher Buffer zurückgegeben wird oder ob die Inhalte nicht stimmen, habe ich nicht weiter untersucht.

Hier die getestete Antwort:

TBitmap ist NICHT threadsave. (getestet mit XE10.1 Berlin und FMX.)

Das Böse daran ist, dass man vieles nicht merkt, aber die Bilder sehen u.U. im Thread anders aus als gezeichnet.

Testaufbau:

1) Es werden im Mainthread eine zufällige BmpSize, 100 zufällige Koordinaten, 100 zufällige Farben, 100 zufällige Opacities usw. in einen Buffer geschrieben.
2) Eine Methode BmpBuilder baut eine Bmp mit dem Inhalt dieses Buffers, z.B. 100 Linien mit 100 verschiedenen Farben, die ja vorher per Zufall bestimmt wurden.
3) Im MainThread wird eine Bmp Referenz mit dem BmpBuilder generiert.
4) In 6 TTasks wird je eine eigene Bmp mit demselben BmpBuilder generiert.
5) Dann werden die Bmps im Mainthread oder auch in der Task mit der Referenz Pixelweise verglichen.
6) Dann beginnt alles wieder mit Schritt 1 mit neuen zufälligen Werten.

Ergebnisse:

Mit Synchronize im BmpBuilder: eine Fehler erkennbar, auch nach Stunden und Millionen Bmp Vergleichen festgestellt.

Ohne Synchronize:, also TBitmap-Methoden direkt im Thread bemutzt:
Schneller Absturz bei Benutzung von z.B. TextWidth, TextHeight und FillText. OK, ... das bekommt man ja mit.

Aber folgendes bekommt man nicht mit:

z.B. die Canvas-Methoden Begin/EndScene, Map/Unmap, DrawLine und einige mehr, stürzen nicht ab, aber die generierte Bmp
zeigt zufällige Fehler im Bild mit einer Wahrscheinlichkeit von 1..10% der getesteten Bmps (mehrfach mehrere Millionen Bmps getestet)?

Nicht weiter untersucht, da ausreichend fuer die Beurteilung, dass alle TBitmap-Methoden nur im Mainthread benutzt werden sollten.
Peter Kaisler
Das einzig Komplizierte ist zu begreifen wie einfach es ist.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.198 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TBitmap ist NICHT threadsave

  Alt 13. Jun 2016, 22:57
TBitmap verwendet Windows-Ressourcen.
Und diese sind per Defintion Thread-Affine und sind nur im erzeugenden Thread gültig
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Kraisel
Kraisel

Registriert seit: 19. Mär 2012
Ort: Bochum-Linden
64 Beiträge
 
Delphi 12 Athens
 
#3

AW: TBitmap ist NICHT threadsave

  Alt 14. Jun 2016, 02:08
Unter FMX (Firemonkey) kann man nicht unbedingt von Windows-Resourcen ausgehen.
Peter Kaisler
Das einzig Komplizierte ist zu begreifen wie einfach es ist.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.198 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TBitmap ist NICHT threadsave

  Alt 14. Jun 2016, 08:42
Unter FMX (Firemonkey) kann man nicht unbedingt von Windows-Resourcen ausgehen.
Wenns unter Windows läuft vermutlich schon (auch wenn ich die Details der FMX-Implementierung nicht kenne)
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: TBitmap ist NICHT threadsave

  Alt 14. Jun 2016, 09:10
Die Aussage von Marco Cantu dazu lautet "TBitmap ist niemals für die Verwendung ausserhalb des MainThreads gedacht gewesen." (egal ob VCL/FMX).

Von daher ist diese Erkenntnis nicht wirklich neu oder überraschend.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: TBitmap ist NICHT threadsave

  Alt 14. Jun 2016, 09:18
Hallo Peter,

kannst Du Deine Testroutine hier mal hochladen?

Würde es gerne selber mal nachvollziehen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.122 Beiträge
 
Delphi 12 Athens
 
#7

AW: TBitmap ist NICHT threadsave

  Alt 14. Jun 2016, 13:15
TBitMap und vorallem dessen TCanvas verwenden globale Instanzen von verschiedenen Delphiressourcen,
wie z.B. Fonts, Brushs, Pens usw.

Das kann also nicht so einfach Threadsave werden, so lange noch irgendwo auf etwas Globales zugriffen wird.



Abgesehn davon, daß in Windows GDI-Ressourcen an den erstellenden Thread gebunden sind.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.167 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: TBitmap ist NICHT threadsave

  Alt 14. Jun 2016, 13:32
Die Aussage von Marco Cantu dazu lautet "TBitmap ist niemals für die Verwendung ausserhalb des MainThreads gedacht gewesen." (egal ob VCL/FMX).

Von daher ist diese Erkenntnis nicht wirklich neu oder überraschend.
Vorausgesetzt man geht davon aus dass die offizielle Doku nicht reicht und man zusätzlich immer Community-Foren, Twitter, Google und sonstwas-Accounts von bestimmten Leuten folgen muss um die Bibliotheken fehlerfrei verwenden zu können.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: TBitmap ist NICHT threadsave

  Alt 14. Jun 2016, 15:40
Die Aussage von Marco Cantu dazu lautet "TBitmap ist niemals für die Verwendung ausserhalb des MainThreads gedacht gewesen." (egal ob VCL/FMX).

Von daher ist diese Erkenntnis nicht wirklich neu oder überraschend.
Vorausgesetzt man geht davon aus dass die offizielle Doku nicht reicht und man zusätzlich immer Community-Foren, Twitter, Google und sonstwas-Accounts von bestimmten Leuten folgen muss um die Bibliotheken fehlerfrei verwenden zu können.
Wieso das denn jetzt?

Mir war eigentlich schon immer bewusst, dass alles was mit VCL zu tun hat nicht threadsafe ist. Analog gilt das auch für FMX.

Wenn man nicht weiß, wozu die Klasse XY nun gehört, dann schaut man sich den Namespace an und weiß sofort, wo man kein threadsafe erwarten kann
Delphi-Quellcode:
Vcl.Graphics.TBitmap // <- Vcl davor => NEIN
FMX.Graphics.TBitmap // <- FMX davor => NEIN
Prinzipiell ist eigentlich alles erst einmal als nicht threadsafe anzusehen. Die Dokumentation sollte es explizit hervorheben was threadsafe ist und nicht umgekehrt, sonst sieht man vor lauter nicht threadsafe den Thread nicht mehr.

VCL und FMX sind zudem immer noch als MainThread-Affin anzusehen (darum geht es hier eigentlich und nicht um threadsafe)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (14. Jun 2016 um 15:44 Uhr)
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#10

AW: TBitmap ist NICHT threadsave

  Alt 14. Jun 2016, 16:37
Die Aussage von Marco Cantu dazu lautet "TBitmap ist niemals für die Verwendung ausserhalb des MainThreads gedacht gewesen." (egal ob VCL/FMX).
In meinem Sortierkino läuft TBitmap in Extra-, also Nicht-VCL- bzw. Nichtmainthreads wie gewünscht.

Geändert von Delphi-Laie (14. Jun 2016 um 16:40 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz