Autor Beitrag
worm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 135


D6 Prof
BeitragVerfasst: Do 25.08.05 22:50 
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. 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
Einloggen, um Attachments anzusehen!
_________________
In the beginning, the universe was created. This has made a lot of people very angry, and is generally considered to have been a bad move.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 135


D6 Prof
BeitragVerfasst: 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.

_________________
In the beginning, the universe was created. This has made a lot of people very angry, and is generally considered to have been a bad move.