Die CriticalSection synchronisiert nicht mit dem Hauptthread sondern mit sich selbt. Eine
VCL-Anweisung in einem Thread wird immer im Kontext des Threads ausgeführt und nicht im Hauptthread. Dazu gibt es TThread.Synchronize, das die übergebe Methode in eine Liste steckt und dann den Thread solange blockiert, bis der Hauptthread in der Botschaftsschleife die Synchronize-Liste abgearbeitet (aufgerufen) hat. Danach geht es im Thread weiter. Der
VCL Code in der zu synchronisierenden Methode wird also nicht vom Thread aufgerufen, sondern vom Hauptprogramm und das in der Messageloop.