Autor Beitrag
Sidorion
ontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 63



BeitragVerfasst: Mo 19.03.07 16:12 
Folgendes Problem:
Ich habe einen Thread, der suspendiert erzeugt und mit resume gestartet wurde. Nachdem ert seine Arbeit verrichtet hat, soll er sich selber suspendieren. Allerdings läuft die Abarbeitung sofort nach dem Befehl suspend weiter (am resume im Hauptthread kommt er nicht vorbei, da ist ein Unterbrechungspunkt).

Wenn ich die debug-DCUs anschalte und in TThread.suspend 'hineindebuggere' stellt sich hgeraus, dass der Thread bereits suspendiert ist!

Kann es sein, dass man einen Thread 'zu oft' resumen kann, d.h. der Suspend-Zähler im BS negativ wird?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 19.03.07 18:54 
Du solltest wenn möglich auf Suspend/Resume verzichten.

Suspend bedeutet das der Thread zum nächstmöglichen Zeitpunkt suspendet wird(also üblicherweise wenn die von Windows zugewiesene Zeitscheibe abgelaufen ist) und NICHT direkt wenn suspend aufgerufen wird.

Wenn Suspend und Resume (zur Synchronisierung) auch noch von verschiedene Thread ausgeführt wirst bekommst du sehr schnell Probleme weil nicht vorhersehbar ist in welcher Reihenfolge denn nun wirklich Suspended bzw. Resumed wird.

Um dir eine Alternative vorzuschlagen sollte du kurz schildern warum du das so machst(warum denn Thread nicht einfach auslaufen lassen? Nach deiner Beschreibung hat der Thread seinen Job ja bereits erledigt).

Gruß
Ralf
Sidorion Threadstarter
ontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 63



BeitragVerfasst: Do 22.03.07 17:10 
Der Trick war hier ein ganz anderer: Das war wieder so ein Fall von 'Code vom Kollegen'. Der Thread A hat eine Funktion in Thread B gerufen. In dieser Funktion wurde Suspend gerufen, also wurde Thread B suspendiert, der eigentlich schon suspendiert war und Thread A lief natürlich weiter.
Der Kollege dachte, da ja gerade A bearbeitet wird (Threadkontext) auch A suspendiert wird. Tatsächlich bezieht sich 'Suspend' aber auf den Instanzenkontext, nicht auf den Threadkontext. Dieser Fehler ist sozusagen nur deshalb nicht aufgefallen, da B auch von TThread abgelitten war, sonst hätte ers gleich gemerkt.