Sleep in einem Thread ist auch nicht gut. Wenn das System runter fährt, benachrichtigt es Dein Programm, das muss sich in einer kurzen Zeit beenden können, sonst wird es als eingefroren angezeigt.
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. Sobald man das Event dann aktiviert, arbeiten alle Threads unmittelbar weiter, ohne auf das Timeout zu warten. Im Thread selbst sollte man dann noch die Rückgabe von
WaitForSingleObject
prüfen, und die Bearbeitung entsprechend sofort einstellen, wenn nicht
WAIT_TIMEOUT
zurückgegeben wurde.