In linea generale, si deve solo tenere conto che TThreadList rappresenta una lista di oggetti che incorpora gli strumenti necessari per l'accesso sincronizzato da più thread alla lista stessa, e va utilizzata chiamando LockList (una sola volta) ottenendo come valore di ritorno la lista degli oggetti su cui lavorare (bloccando, cioè mettendo in attesa, gli altri thread) e invocando alla fine UnlockList quando l'uso della suddetta lista è terminato.

Se si fanno più chiamate a LockList, devono corrispondere altrettante chiamate a UnlockList, altrimenti la lista rimane bloccata.

La prassi di utilizzo si può schematizzare così:

codice:
var
  List: TList;
begin
  List := ThreadList.LockList;
  try
    // ...uso di List...
  finally
    ThreadList.UnlockList;
  end;
end;
Se il meccanismo "non funziona", l'errore specifico è da ricercarsi altrove.

Ciao!