// // starts the sorter // sorts all the luggages and puts them in a buffer // public void StartSorting() { Luggage luggage = null; bool wait; while (true) { //counts so if the all the frontdesk buffer is empty then wait to get a pulse byte count = 0; //runs through every frontdesk buffer for (int i = 0; i < FrontDeskBuffer.FrontDesks.Length; i++) { wait = false; //looks if it has a luggage if (luggage == null) { //locks a buffer lock (FrontDeskBuffer.FrontDesks[i]) { //looks if the buffer is full if (FrontDeskBuffer.FrontDesks[i].Reserved != 0) { //if not take a luggage from a buffer //infrom the user //by locking the writer obj lock (Program.writerLock) { Console.SetCursorPosition(0, Thread.CurrentThread.ManagedThreadId); Console.WriteLine("{0,-5}{1,-11} takes a luggage from frontdeskbuffer {2}", "[" + Thread.CurrentThread.ManagedThreadId + "]", "(Sorter)", i); Console.SetCursorPosition(0, 0); } //take the luggage luggage = FrontDeskBuffer.FrontDesks[i].GetLuggage(); //pulse to the frontdesk that it is not full any more lock (FrontDeskBuffer.FrontDesks[i].full) { Monitor.Pulse(FrontDeskBuffer.FrontDesks[i].full); } } else { //if the buffer is empty count one up count++; } } } //looks if it have a luggage if (luggage != null) { //lock the terminal buffer the luggage is going lock (TerminalBuffers.Terminals[luggage.Tarminal]) { //looks if the buffer is full if (!TerminalBuffers.Terminals[luggage.Tarminal].IsFull) { //if not inform the user //by locking the writer obj lock (Program.writerLock) { Console.SetCursorPosition(0, Thread.CurrentThread.ManagedThreadId); Console.WriteLine("{0,-5}{1,-11} Adds the luggage to {2}", "[" + Thread.CurrentThread.ManagedThreadId + "]", "(Sorter)", luggage.Tarminal); Console.SetCursorPosition(0, 0); } //adds the time the luggage got sorted luggage.Sorted = DateTime.Now; //insert the luggage to the terminal buffer TerminalBuffers.Terminals[luggage.Tarminal].AddLuggage(luggage); //informs the terminal that it is not empty any more lock (TerminalBuffers.Terminals[luggage.Tarminal].empty) { Monitor.Pulse(TerminalBuffers.Terminals[luggage.Tarminal].empty); } //removes the luggage luggage = null; } else { //if the buffer is full set wait to true wait = true; } } //if it has to wait before it can insert the luggage if (wait) { //wait to the terminal has pulse that the buffer is not full anymore lock (TerminalBuffers.Terminals[luggage.Tarminal].full) { Monitor.Wait(TerminalBuffers.Terminals[luggage.Tarminal].full); } } } } //if all three buffer is empty if (count == FrontDeskBuffer.FrontDesks.Length) { //wait to get a pulse from one of the frontdesk lock (FrontDeskBuffer.FrontDesks) { //inform the user //by locking the writer obj lock (Program.writerLock) { Console.SetCursorPosition(0, Thread.CurrentThread.ManagedThreadId); Console.WriteLine("{0,-5}{1,-11} I will wait \t\t\t\t\t\t", "[" + Thread.CurrentThread.ManagedThreadId + "]", "(Sorter)"); Console.SetCursorPosition(0, 0); } Monitor.Wait(FrontDeskBuffer.FrontDesks); } } } }
// //starts the frontdesk it can be closed and open, and still run in the method // public void StartFrontDesk() { //used to wait if the buffer is full bool wait; //the luggage Luggage luggage = new Luggage(); while (true) { //looks if the desk has to close if (!closeDesk) { //if not "make" a luggage //sets the wait to false as default wait = false; //takes a person and makes the kuggage to for them if (luggage == null) { //locks the person buffer lock (ReservationBuffer.reservationBuffer) { AirplanenTime airplanenTime; Person person = ReservationBuffer.reservationBuffer.GetPerson(); int Terminal = 0; bool planeFund = false; //look if the plan has a terminal yet for (int i = 0; i < AirplanenController.GetAirplanenTimes.Count; i++) { airplanenTime = AirplanenController.GetAirplanenTimes[i]; if (airplanenTime.Destination == person.Destination && airplanenTime.Landing < DateTime.Now && DateTime.Now < airplanenTime.LeftOff.AddSeconds(-30)) { planeFund = true; Terminal = airplanenTime.TermainalNumber; } } if (planeFund) { luggage = new Luggage(id++, Terminal); luggage.CheckIn = DateTime.Now; lock (ReservationBuffer.reservationBuffer.full) { Monitor.Pulse(ReservationBuffer.reservationBuffer.full); } } else { ReservationBuffer.reservationBuffer.AddPerson(person); } lock (Program.writerLock) { Console.SetCursorPosition(0, Thread.CurrentThread.ManagedThreadId); Console.WriteLine("{0,-5}{1,-5} assisting {2} that will go to {3} \t\t", "[" + Thread.CurrentThread.ManagedThreadId + "]", "(FrontDesk)", person.Name, person.Destination); Console.SetCursorPosition(0, 0); } } } //lock the buffer lock (FrontDeskBuffer.FrontDesks[buffer]) { //look if it is full if (!FrontDeskBuffer.FrontDesks[buffer].IsFull && luggage != null) { //if there is room //inform the user //add the luggage FrontDeskBuffer.FrontDesks[buffer].AddLuggage(luggage); //set the luggage to null luggage = null; //pulse to sorter that something is in the buffer lock (FrontDeskBuffer.FrontDesks) { Monitor.Pulse(FrontDeskBuffer.FrontDesks); } } else if (luggage != null) { //if it is full //inform the user lock (Program.writerLock) { Console.SetCursorPosition(0, Thread.CurrentThread.ManagedThreadId); Console.WriteLine("{0,-5}{1,-5} Buffer is full", "[" + Thread.CurrentThread.ManagedThreadId + "]", "(FrontDesk)"); Console.SetCursorPosition(0, 0); } //set wait to true wait = true; } //else //{ // //if no terminals are open // //inform the user // lock (Program.writerLock) // { // Console.SetCursorPosition(0, Thread.CurrentThread.ManagedThreadId); // Console.WriteLine("{0,-5}{1,-5} No Terminals is open \t\t\t\t\t", "[" + Thread.CurrentThread.ManagedThreadId + "]", "(FrontDesk)"); // Console.SetCursorPosition(0, 0); // } //} } if (wait) { //if it has to wait lock the full obj in the buffer lock (FrontDeskBuffer.FrontDesks[buffer].full) { //inform the user lock (Program.writerLock) { Console.SetCursorPosition(0, Thread.CurrentThread.ManagedThreadId); Console.WriteLine("{0,-5}{1,-5} I will wait \t\t\t\t\t", "[" + Thread.CurrentThread.ManagedThreadId + "]", "(FrontDesk)"); Console.SetCursorPosition(0, 0); } //wait to it gets a pulse Monitor.Wait(FrontDeskBuffer.FrontDesks[buffer].full); } } } else { //if it has to close lock the open obj lock (open) { //infrom the user lock (Program.writerLock) { Console.SetCursorPosition(0, Thread.CurrentThread.ManagedThreadId); Console.WriteLine("{0,-5}{1,-5} Close frontdesk \t\t\t\t", "[" + Thread.CurrentThread.ManagedThreadId + "]", "(FrontDesk)"); Console.SetCursorPosition(0, 0); } //waits to it gets a pulse Monitor.Wait(open); } } Thread.Sleep(250); } }