Autor Beitrag
HenryHux
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Do 07.03.13 21:19 
Hi,

ich habe wohl das Prinzip von Multithreading nicht ganz verstanden und wollte einmal hier nachfragen, wie das denn genau abläuft.
Und zwar habe ich aus verschiedenen Gründen in meinen Projekten auf die Thread-Safety achten müssen (zb. Arbeiten mit TBitmaps).
Habe auch die Synchronisation in der Thread-Klasse ganz gut hinbekommen, jetzt stoße ich aber auf Probleme, die ich nicht ganz zuordnen kann.
Und zwar starte ich mehrere Threads, die wiederum jeweils die gleiche Klasse instanzieren.
In dieser Klasse (abgeleitet von TObject und nicht TThread) werden Bitmaps erzeugt und verarbeitet.
Das klappt auch gut, ich bekomme jedoch sehr selten einen Fehler, wie "Bitmap ist ungültig". Leider kann ich die Fehler nicht reproduzieren, sondern sie treten anscheinend völlig zufällig auf und der Compiler zeigt mir auch keine genaue Fehlerstelle.
Durch Exception-Handling weiß ich jedoch, dass der Fehler in Prozessen auftritt, in denen mit diesen Bitmaps gearbeitet wird.
Da Bitmaps nicht threadsicher sind, wäre meine Frage jetzt, ob ich auch in Klassen die von Threads instanziert werden auf die Thread-Safety achten muss.

Vielen Dank,

lg
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 07.03.13 23:00 
Wenn ein Thread ein Objekt erstellt, und dieses Objekt dann im Kontext des Threads auf Bitmaps rummalt, dann kann das in die Hose gehen. Abhilfe kann man afaik mit Canvas.Lock schaffen.

Generell gilt für alle Dinge, (und das fängt schon bei einfachen Integern an), dass man auf Thread-Sicherheit achten muss, wenn man Daten zwischen verschiedenen Threads austauscht (lesen/schreiben). Es muss immer sichergestellt sein (z.B. über CriticalSection), dass immer nur ein Thread gleichzeitig schreibend darauf zugreift. Gleichzeitiges Lesen ist in der Regel kein Problem (wenn nicht grade jemand anderes schreibt).

_________________
We are, we were and will not be.

Für diesen Beitrag haben gedankt: HenryHux
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Fr 08.03.13 01:15 
Canvas als solches ist nicht Threadsave, eine möglich Lösung für den Umgang mit Bitmaps in Thread hatte ich hier stackoverflow.com/qu...-n/14804378#14804378 einmal beschrieben. Ein Beispielcode der die Unbrauchbarkeit des Canvas demonstriert habe ich angehängt. Canvas.Lock kann helfen, allerdings ist dann die Performance dahin.
Einloggen, um Attachments anzusehen!
_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS

Für diesen Beitrag haben gedankt: HenryHux
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Fr 08.03.13 11:18 
Vielen Dank,

ich habe es jetzt mit Canvas.Lock gemacht und noch keine Fehler bekommen.
Allerdings leidet die Performance wirklich..

Lg