private void Muovi() { if (!muovi.IsAlive) { lock (x) { //lstPiani.ItemsSource = Ascensore.Fila; //il thread è fermo, lo faccio ripartire Destinazione = Ascensore.Vai(); muovi = new Thread(new ThreadStart(MuoviAscensore)); muovi.Start(); } } }
public Piano Vai() { try { Piano toReturn = GetPiano(Peek()); Piano = Pop(); //sezione critica : il dequeue return(toReturn); } catch (Exception ex) { throw ex; } }
private void MuoviAscensore() { //devo capire se scende o se sale //TODO : Animazione int pSalite, pScese; Thickness t = new Thickness(0); this.Dispatcher.BeginInvoke(new Action(() => { t = grdAscensore.Margin; })); Thread.Sleep(150); topCorrente = t.Top; topDestinazione = Destinazione.MarginTop; //AnimazioneAscensore(); Thread m = new Thread(new ThreadStart(AnimazioneAscensore)); m.Start(); m.Join(); pScese = Ascensore.QuantiScendono(); pSalite = Ascensore.Arrivato(); bool cancellaOmino = true; if (Ascensore.Piani[Ascensore.Piano].NPersone > 0) { cancellaOmino = false; } this.Dispatcher.BeginInvoke(new Action(() => { if (cancellaOmino) { switch (Ascensore.Piano) { case 0: o0 = new Omino(new Thickness(0, o0.MarginTop, 0, 0), 50); p_0.Visibility = Visibility.Hidden; p_0.Margin = new Thickness(0, o0.MarginTop, 0, 0); break; case 1: o1 = new Omino(new Thickness(0, o1.MarginTop, 0, 0), 50); p_1.Visibility = Visibility.Hidden; p_1.Margin = new Thickness(0, o1.MarginTop, 0, 0); break; case 2: o2 = new Omino(new Thickness(0, o2.MarginTop, 0, 0), 50); p_2.Visibility = Visibility.Hidden; p_2.Margin = new Thickness(0, o2.MarginTop, 0, 0); break; case 3: o3 = new Omino(new Thickness(0, o3.MarginTop, 0, 0), 50); p_3.Visibility = Visibility.Hidden; p_3.Margin = new Thickness(0, o3.MarginTop, 0, 0); break; case 4: o4 = new Omino(new Thickness(0, o4.MarginTop, 0, 0), 50); p_4.Visibility = Visibility.Hidden; p_4.Margin = new Thickness(0, o4.MarginTop, 0, 0); break; } } if (pScese > 0) { Thread tr = new Thread(new ThreadStart(Scendi0)); switch (Ascensore.Piano) { case 0: tr = new Thread(new ThreadStart(Scendi0)); break; case 1: tr = new Thread(new ThreadStart(Scendi1)); break; case 2: tr = new Thread(new ThreadStart(Scendi2)); break; case 3: tr = new Thread(new ThreadStart(Scendi3)); break; case 4: tr = new Thread(new ThreadStart(Scendi4)); break; } //MessageBox.Show("anima"); tr.Start(); } t = grdAscensore.Margin; lbl4.Content = Ascensore.Piani[4].NPersone; lbl3.Content = Ascensore.Piani[3].NPersone; lbl2.Content = Ascensore.Piani[2].NPersone; lbl1.Content = Ascensore.Piani[1].NPersone; lbl0.Content = Ascensore.Piani[0].NPersone; lblNumPersone.Content = Ascensore.Persone; })); while (true) { //MessageBox.Show(Ascensore.Count().ToString()); if (Ascensore.Count() > 0 && (!Ascensore.AspettaPrenotazione || Ascensore.Persone == 0)) { try { string x = ""; foreach (int n in Ascensore.Fila) { x += n + ", "; } //MessageBox.Show(x); Destinazione = Ascensore.Vai(); MuoviAscensore(); } catch (Exception ex) { MessageBox.Show("errore"); } } Thread.Sleep(20); } }