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.