The problem is that TThread.Synchronize()
is broken in FireMonkey. See this QC report:
Report #123579: TThread.Synchronize() and TThread.Queue() do not work correctly in FireMonkey
This has only just recently been discovered, but it has been broken since FireMonkey was first introduced and nobody apparently noticed until now.
Until Embarcadero fixes it, try calling CheckSynchronize()
periodically in the main thread, such as in a timer.