Ich meine es so:
Downloadthread:
CS.Enter
MT.WartendeThreads.Add(self)
CS.Leave
Synchronize(MT.NeueAufgabe)
Suspend
Hauptthread, NeueAufgabe:
for each (wartender Thread) do
neue Aufgabe zuteilen
Resume
Ansonsten kannst du auch eine Liste mit herunterzuladenden Dateien bereitstellen und es so lösen:
Downloadthread:
CS.Enter
MT.Daten := irgendwas
Synchronize(TeilFertig)
Aufgabe := Dequeue(Aufgaben)
CS.Leave
Wie das TeilFertig-Dings im Hauptthread aussieht, überlasse ich dir