Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Thread läuft nach suspend weiter


Sidorion - Mo 19.03.07 16:12
Titel: Thread läuft nach suspend weiter
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 - 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 - 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.