Algunos tips que son buenos a tener en cuenta:
Usa una libreria de alto nivel en vez de programar a pelo. Hacerlo manualmente es de lo mas fácil de hacer equivocadamente, y no hay nadie que pueda decir que lo hace correcto sin ayuda mecánica: ni MS, ni Google, ni Mozilla, ni Apple ni nadie. Notaras que TODOS ESTOS crean librerías especializadas e incluso lenguajes COMPLETOS (Rust, Go) por la complejidad del tema.
"no se comunique compartiendo memoria; compartir memoria comunicándose" es la mejor manera. Usa un "canal" de comunicación y pasa datos, pero NO intentes amarrar punteros, objetos o recursos. Es idéntico a como funciona la programación web:
NO te conectas directo (por punteros o similar) a una BD: Creas un JSON (datos) que envía por POST los datos de conexión y
dentro de un hilo se hace todo.
Igualmente en una app el multi-hilo se maneja mejor de forma similar: Mandas comandos/datos y dentro del hilo que realmente "tiene" la conexión devuelves los datos, pero nunca das acceso directo a un recurso desde multiples hilos.
TODO esto te lo debe dar una libreria de alto nivel y por ende no deberias preocuparte de como se hace, solo que nunca "mandas" un objeto como una conexion o archivo o formulario, solo la PETICION de que el otro lado haga algo. Es como el modelo "cliente/servidor". Ok?
---
Ahora lo mas simple es solo tener 2 hilos a la vez: El que maneja la UI que es por defecto y no hay nada que tengas que hacer ahi y uno de background" para descargar tareas que no bloqueen la UI. En tal caso es mucho mas fácil, pero sigue la consigna: NO pases (ni con locks hechos a pelo, todo debe ser por medio de la libreria de alto nivel) recursos ni objetos "pesados", pasa un record/json/dato plano que le comunique al otro lado lo que debe hacer y devuelve datos de igual manera.
--
Si tienes un requerimiento que sea mas complejo que 2 hilos, entonces seria bueno que lo indiques, porque hay varios patrones de diseño que te permiten resolver esto de forma correcta y con mucho menos lios.
P.D: Estos patrones lo explican en esta libreria:
https://zguide.zeromq.org/docs/chapter2/ que es multi-lenguaje/plataforma y es de los recuersos que mejor explican los diseños comunes de este tema.
P.D.2: La libreria que use hace tiempo que resuelve todo esto en Delphi es
http://www.omnithreadlibrary.com. Parece que la forma directa en Delphi en ultimas versiones es
https://blogs.embarcadero.com/learn-...-using-delphi/