public void AssignJobs(IEnumerable <PassengerRequest> passengerRequests) { foreach (var item in passengerRequests) { PassengerRequests.Enqueue(item); } }
public void Handle(Message msg) { // receive message with PID: passenger ID // and value if passenger is missionary if (CONDITION_AddPassengerToBoat) { PassengersInBoat.Add(msg); } else { PassengerRequests.Add(msg); } // we collect passenger requests and put them into boat if there is room }
private bool ProcessPassengers() { // after 4 seconds, check if CONDITION_CrossRiver if (CONDITION_CrossRiver) { List <String> temp = new List <string>(); foreach (var p in PassengersInBoat) { temp.Add(pre + p.PID); } var tempBus = new BusBuilder() .WithLogging(new ConsoleLogger()) .DefineErrorQueue("Boat.errors") .DefineWriteQueues(temp.ToArray()) .CreateLocalQueuesAutomatically() .JsonSerialization() .CreateBus(); // send it to all passengers in boat that crossed the river (: tempBus.Send(true); PassengersInBoat.Clear(); // transfer passengers from waiting list to boat var removeList = new List <int>(); foreach (var pr in PassengerRequests) { if (CONDITION_AddPassengerToBoat) { PassengersInBoat.Add(pr); removeList.Add(pr.PID); } } PassengerRequests.RemoveAll(r => removeList.Any(a => a == r.PID)); return(true); // keep going } // die return(false); }
private void ElevatorThread() { lock (locker) { if (PassengerRequests != null && PassengerRequests.Count > 0) { PassengerRequest request; PassengerRequests.TryPeek(out request); if (request != null) { //coming down to pick a person and go up if (CurrentElevatorStatus == ElevatorStatus.Idle && request.PassengerRequestDirection == Direction.Up && CurrentFloor > request.SourceFloorIndex && UpQueue.Count == 0) { DownQueue.Add(request.SourceFloorIndex); DownQueue.Add(request.TargetFloorIndex); CurrentElevatorStatus = ElevatorStatus.Moving; ElevatorDirection = Direction.Up; Console.WriteLine($"Elevator# {ElevatorNumber} is moving down from {CurrentFloor}-->{request.SourceFloorIndex} to serve (up)_request,{request.SourceFloorIndex}-->{request.TargetFloorIndex}"); } //coming up to pick a person and go down else if (CurrentElevatorStatus == ElevatorStatus.Idle && request.PassengerRequestDirection == Direction.Down && CurrentFloor < request.SourceFloorIndex && DownQueue.Count == 0) { UpQueue.Add(request.SourceFloorIndex); UpQueue.Add(request.TargetFloorIndex); CurrentElevatorStatus = ElevatorStatus.Moving; ElevatorDirection = Direction.Down; Console.WriteLine($"Elevator# {ElevatorNumber} is moving up from {CurrentFloor}-->{request.SourceFloorIndex} to serve (down)_request,{request.SourceFloorIndex}-->{request.TargetFloorIndex}"); } else if (request.PassengerRequestDirection == Direction.Up && CurrentFloor <= request.SourceFloorIndex && DownQueue.Count == 0) { UpQueue.Add(request.SourceFloorIndex); UpQueue.Add(request.TargetFloorIndex); ElevatorDirection = Direction.Up; CurrentElevatorStatus = ElevatorStatus.Moving; PassengerRequests.TryDequeue(out request); Console.WriteLine($"Elevator# {ElevatorNumber} received a request_details(UP) " + $":{request.SourceFloorIndex}-->{request.TargetFloorIndex}"); } else if (request.PassengerRequestDirection == Direction.Down && CurrentFloor >= request.SourceFloorIndex && UpQueue.Count == 0) { DownQueue.Add(request.SourceFloorIndex); DownQueue.Add(request.TargetFloorIndex); ElevatorDirection = Direction.Down; CurrentElevatorStatus = ElevatorStatus.Moving; PassengerRequests.TryDequeue(out request); Console.WriteLine($"Elevator# {ElevatorNumber} received a request_details(DOWN) :{request.SourceFloorIndex}-->{request.TargetFloorIndex}"); } } } } }
public void AssignJob(PassengerRequest passengerRequest) { PassengerRequests.Enqueue(passengerRequest); }