Erzeuge jeden Thread im Zustand "suspended".
Gib dann (im Hautpthread) jedem Threadobjekt alle Daten, die es für seine Arbeit braucht.
Delphi-Quellcode:
mythread := TMyThread.Create({suspended=}True);
mythread.Startpunkt := Point(0,0);
mythread.Endpunkt := Point(255,255);
mythread.xxxx := ...
...
mythread.Resume; // jetzt den Thread starten
Mit dieser simplen Technik bekommt der Thread alles was er braucht von Aussen mitgeteilt.
Anstatt dass der Thread aus den Daten des Hauptthreads liest (was Probleme macht)
bekommt er eine Kopie der Daten.