Bene, ora mi spego meglio.
Il programma si collega e rimane collegato contemporaneamente con un certo numero di terminali collegati via ip. Ogni terminale è a sua volta coltrollato da un thread generato dal programma principale. Tale thread si preoccupa di ricevere dei dati dai terminali e di elaborali. L'elenco dei thread è contenuto in una lista che ho chiamato ListaThread.
In acluni casi l'utente deve inviare degli ordini a tutti i terminali. Per fare questo io dal form principare eseguo:

codice:
  for I := ListaThread.Count - 1 downto 0 do begin
    if Assigned(TThTerminaleServer(ListaThread[I])) then begin
      TThTerminaleServer(ListaThread[I]).AggionaBacheca(self);
    end;
  end;
La funzione "AggionaBacheca(self);" contenuta in ogni thread non fa altro che generare un evento all'interno del thread stesso in questo modo:
codice:
  if Assigned(EAggionamentoBacheca) then OnAggionamentoBacheca();
L'evento customizzato nel thread è così composto:
codice:
type
  TNotifyEvent= procedure(Sender: TObject) of object;
...
      EAggionamentoBacheca: TNotifyEvent;
    published
      property OnAggionamentoBacheca: TNotifyEvent read EAggionamentoBacheca write EAggionamentoBacheca;
...
constructor
  EAggionamentoBacheca:= AggionamentoBacheca;
...
procedure TThTerminaleServer.AggionamentoBacheca(Sender: TObject);
begin
  ...
end;
Quando viene dato il comando dall'utente effettivamente viene correttamente percorsa la lista, viene generato un evento all'interno di ogni thread, il thread manda correttamente i dati al proprio terminale.
La cosa però si verifica in modo ciclico, in sequenza dal primo all'ultimo thread. Io invece ho bisogno che l'utente dia il comando ed i thread inviino i dati in parallelo restituendo subito il controllo dell'applicazione all'utente senza quindi che l'utente debba attendere che la sequenza sia terminata.