CriticalSection geht nicht, da du in eine CritcalSection mehrmals hineinlaufen kannst, solange du im gleichen Thread bist. Und das ist hier ja der Fall. Semaphore oder Event würde gehen, aber:
Application.ProcessMessages zu verwenden ist (fast) immer ein falscher Konzeptansatz. Und wenn du schon über Synchronistaionsobjekte sprichst, warum nimmst du nicht gleich einen Thread. Meistens läßt sich ja mit einem Thread das schlechte ineinanderwurschteln von Application.ProcessMessages vermeiden.
Lies dir mal zu Application.ProcessMessages das hier durch:
2. Absatz!
du bist dir ja der Problematik schon bewusst. Versuch sie besser gleich komplett zu umgehen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.