Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 34
  1. #1

    [C#] Un Evento di fine su Multi Thread

    Salve,
    dato che avvio 10 Thread contemporaneamente,
    come posso intercettare la fine di tutti e 10, per dare un messaggio di fine unico ???

  2. #2
    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<<<

  3. #3
    Non è troppo dispendioso per il processore ?

  4. #4
    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<<<

  5. #5
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    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

  6. #6
    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 ???

  7. #7
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    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

  8. #8
    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.

  9. #9
    Utente di HTML.it L'avatar di albgen
    Registrato dal
    Jun 2005
    Messaggi
    3,249
    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

  10. #10
    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();
                }
            }
        }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.