Como solución genérica, pasar las cosas a un Thread cuando el programa se ralentiza puede ser una buena opción, pero no siempre es la más adecuada, ya que los threads tienen sus particuladidades.
Tampoco vale, coger el código "antiguo", pasarlo a un thread y esperar que funcione (tal vez sí, pero no suele ser lo habitual).
Lo primero decir, que las operaciones con Bases de Datos en threads, en según qué casos requieren conexiones diferenes. Por ejemplo, en ADO no puedes usar la misma conexión en 2 threads, porque el componente de conexión no es "thread-safe";En el caso de Firedac hay que mirar bien las especificaciones, porque también tiene sus partocularidades (
https://docwiki.embarcadero.com/RADS...ading_(FireDAC)).
En segundo lugar, veo que estás accediendo a componentes directamente desde el thread que están definidos "fuera" (F_data, FDMemTable1, contador); Almenos yo no los veo ahí. Ese acceso te va a dar problemas, puesto que lo estás haciendo sin sincronizar.
Este código no tiene sentido:
Código Delphi
[-]
Thread.Start;
showmessage('Sincronizacion de Clientes Completada. ' + contador.ToString + 'Clientes Traspasados');
El ShowMessage va a salir nada más iniciar el proceso, no al final.