Das kann man umgehen, indem man statt
Sleep
einfach
WaitForSingleObject mit einem Event (bzw. die entsprechende Kapselung
TEvent
) verwendet. Das Event lässt man permanent auf nonsignaled, bis man von Windows die
WM_QUERYENDSESSION
bzw.
WM_ENDSESSION
Nachricht erhält.
Noch praktischer: ich verwende eine von TThread abgeleitete Basis-Klasse, die dieses Warten als Methode anbietet und das Event im Terminate auslöst. Damit hilft das nicht nur beim Runterfahren Verzögerungen zu vermeiden, sondern auch beim schlichten Beenden des Programmes oder gar nur des Threads.