Salve,
dato che avvio 10 Thread contemporaneamente,
come posso intercettare la fine di tutti e 10, per dare un messaggio di fine unico ???
Salve,
dato che avvio 10 Thread contemporaneamente,
come posso intercettare la fine di tutti e 10, per dare un messaggio di fine unico ???
Crei un 11° thread che cicla continuamente e verifica se la proprietà IsAlive di tutti thread è su false (una lunga catena di AND che neghi), e quando ciò si verifica esce dal ciclo e ti manda il messaggio di fine
Che ne dici?![]()
Mi contraddico facilmente, ma lo faccio così spesso che questo fa di me una persona coerente [Caparezza]
Se la conoscenza crea problemi, non è con l'ignoranza che li si risolve [Isaac Asimov]
>>>Visita il mio blog<<<
Non è troppo dispendioso per il processore ?
l'11 thread non ti consuma praticamente niente di risorse
Mi contraddico facilmente, ma lo faccio così spesso che questo fa di me una persona coerente [Caparezza]
Se la conoscenza crea problemi, non è con l'ignoranza che li si risolve [Isaac Asimov]
>>>Visita il mio blog<<<
Ci sono vari modi per ottenere quello che voi. Sicuramente quello di cepu96 è il peggiore![]()
Vediamo di dire qualcuno di giusto:
1. Utilizzi un array di oggetti di tipo AutoResentEvent(lo chiamo AUR) o ManualResetEvent dove ogni thread setta uno specifico oggetto AUR. Per verificare se tutti hanno finito chiami questo metodo
2.Utilizzi il metodo Join
3. Utilizzi un oggetto Semaphore
I primi due sono i piu adatti per questo scopo.
I got the remedy
azz...,
MSDN è troppo complicato per me nei i thread, è la prima volta che li affronto, non riesco ad applicare gli esempi,
un esempio applicato su un progettino non si trova ???
Ti capisco però il mio consiglio è quello di fare questo sforzo per imparare qualcosa di utile e interessante.
Non credo esista un esempio ad hoc per il tuo caso anche se non ci vogliono ore per farlo.
Al limite usa la soluzione che ha proposto cepu96.
I got the remedy
ok, ti ringrazio e ci provo subito, solo una cosa, a parere tuo quale devo affrontare per primo, quale è la soluzione più adatta alla mia esigenza ???
- tenendo conto che creo n Thread con un Loop che è variabile di volta in volta,
e devo intercettare la fine di tutti i Thread per richiamare una Funzione.
Il primo è piu semplice da implementare sopratutto se sai per certo che il numero di thread è sempre 10.
Anche il secondo è semplice.
Secondo me ti conviene vedere il secondo. Dovrebbe essere piu semplice da capire.
I got the remedy
Fatto !!
Solo che ho dovuto fare una modifica quando il mio Test da "Console" l'ho portato su "Win Form":
vedi il commento su: //WaitHandle.WaitAll(manualEvents);
ho sostituito con:
foreach(WaitHandle handle in manualEvents)
{
handle.WaitOne();
}
altrimneti mi restituiva questo errore: WaitAll for multiple handles on a STA thread is not supported.
cosa ne dici, è sbagliata la correzione ??
codice:public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnStart_Click(object sender, EventArgs e) { const int numThreads = 5; ManualResetEvent[] manualEvents = new ManualResetEvent[numThreads]; State stateInfo; for (int i = 0; i < numThreads; i++) { manualEvents[i] = new ManualResetEvent(false); stateInfo = new State(manualEvents[i]); ThreadPool.QueueUserWorkItem(new WaitCallback(Writer.WriteToFile), stateInfo); } //WaitHandle.WaitAll(manualEvents); foreach(WaitHandle handle in manualEvents) { handle.WaitOne(); } MessageBox.Show("Ho finito con tutti i Thread !!"); } } class State { public ManualResetEvent manualEvent; public State(ManualResetEvent manualEvent) { this.manualEvent = manualEvent; } } class Writer { public static void WriteToFile(object state) { State stateInfo = (State)state; try { //Code // // } finally { stateInfo.manualEvent.Set(); } } }