In der Anwendung werden relativ viele Threads erstellt, die beim Beenden der Anwendung terminiert werden. Das geschieht über Windows Messages, welche die Threads dann abfragen und sich selber terminieren
Eigentlich müsste deine Anwendung alle laufenden Thread in einer Liste speichern.
Beim Programmende wird dann von jedem Thread die Methode
Terminate
aufgeraufen.
(Windows Messages würde ich für diesen Zweck nicht verwenden)
Die Threads fragen periodisch das
property Terminated
ab und beenden sich selber.
Da es einige Zeit dauern kann bis alle Threads reagiert haben sollte der Hauptthread bis zu 3s warten.
Dauert es länger, sollte der Hauptthread weiterlaufen und sich beenden.
Die hängenden Threads werden dann von Windows gewaltsam beendet; was dann natürlich zu Speicher-/Resourcenlecks führt, die aber ebenfalls von Windows entsorgt werden.