Entwickler-Ecke

Open Source Units - Threadobjekt, das beim Suspenden nicht einfrieren kann


worm - Do 25.08.05 22:50
Titel: Threadobjekt, das beim Suspenden nicht einfrieren kann
Hallo!

Vor einigen Monaten bin ich bei Delphi auf ein größeres Problem im Zusammenhang mit Threads gestoßen, dass beim Suspenden des Threads über TThread.Suspend zum Einfrieren der kompletten Applikation durch Deadlock führen kann. Eine genauere Beschreibung und ein Beispielprojekt habe ich hier gepostet [http://www.delphi-forum.de/viewtopic.php?p=286199#286199]. Zur Lösung des Problems habe ich damals eine Unit geschrieben, die einen TThread-Descendant mit überschriebenem Terminated-Property und Suspend-Methode enthält. Diese möchte ich euch nicht vorenthalten. Sie befindet sich im Anhang, inkl. Erklärungen.

TSuspdSafeThread sollte jeden TThread ersetzen, der mit Suspend angehalten wird und entweder selbst threadübergreifend genutzte Critical Sections benutzt oder indirekt in der RTL solche Critical Sections betritt (z.B. GetMem, FreeMem - also fast jeder Thread).


Moderiert von user profile iconUdontknow: Topic aus Neue Einträge / Hinweise / etc. verschoben am Do 20.10.2005 um 15:29


Udontknow - Di 18.10.05 13:35

Hallo!

Ich würde diesen Beitrag gerne in die Open-Source-Units-Sparte verschieben und aber deinen ursprünglichen Beitrag in die Library übernehmen. Ist das in Ordnung?

Edit: Mir fällt da gerade was auf. In der Klasse verbirgst du die eigentliche Suspend-Methode nur, sodaß ein Aufruf von TThread(MySuspdSafeThread).Suspend wieder das gleiche Phänomen an den Tag legt. Übersteuern kannst du die Methode aber nicht, da sie im Vorgänger TThread statisch implementiert ist.

Vielleicht solltest du besser die komplette Thread-Klasse nachbilden und keinen Nachfahren von TThread dafür nutzen, damit man nicht aus irgendeinem Grunde aus Versehen über die Vorgänger-Klasse Suspend aufruft.

Cu,
Udontknow


worm - Mi 19.10.05 21:32

user profile iconUdontknow hat folgendes geschrieben:
Ich würde diesen Beitrag gerne in die Open-Source-Units-Sparte verschieben und aber deinen ursprünglichen Beitrag in die Library übernehmen. Ist das in Ordnung?
Klar!

user profile iconUdontknow hat folgendes geschrieben:
Edit: Mir fällt da gerade was auf. In der Klasse verbirgst du die eigentliche Suspend-Methode nur, sodaß ein Aufruf von TThread(MySuspdSafeThread).Suspend wieder das gleiche Phänomen an den Tag legt. Übersteuern kannst du die Methode aber nicht, da sie im Vorgänger TThread statisch implementiert ist.
Darum hab ich's auch so gelöst, wie es jetzt ist. Klar ist das ein Nachteil, aber die von Dir vorgeschlagene Lösung gefiel mir ebensowenig und war mir in dem Moment außerdem zu zeitaufwändig. Sie sei dem geneigten Leser überlassen. :)
Ein Hinweis auf diese Stolperfalle wäre allerdings unbedingt angebracht.