Exemplo n.º 1
0
        public void Start()
        {
            if (_liftNum == 0)
            {
                Console.WriteLine("楼房{0}无电梯!", _building.Name);
                return;
            }

            for (int i = 0; i < _liftNum; i++)
            {
                LiftEntity lift = new LiftEntity(i, _building);
                lift.Start();
                _lifts.Add(lift);

                ThreadPool.QueueUserWorkItem(LiftWork, lift);
            }

            ThreadPool.QueueUserWorkItem(ManagerWork, _passengers);
        }
Exemplo n.º 2
0
        private void LiftWork(object obj)
        {
            while (true)
            {
                LiftEntity lift = (LiftEntity)obj;
                Console.WriteLine("Lift[{0}] is {1} at {2}", lift.ID, lift.Direction.ToString(), lift.CurrentFloor);
                Console.WriteLine("Lift[{0}] InTargets:{1}", lift.ID, lift.InTargets.Count);
                Console.WriteLine("Lift[{0}] OutTargets:{1}", lift.ID, lift.OutTargets.Count);

                if (lift.InTargets.Contains(lift.CurrentFloor) || lift.OutTargets.Contains(lift.CurrentFloor))
                {
                    lift.Status = LiftStatusEnum.OUT_IN;
                    Console.WriteLine("Lift[{0}]: Out Or In", lift.ID);
                }
                else if (lift.InTargets.Any() || lift.OutTargets.Any())
                {
                    lift.Status = LiftStatusEnum.Running;
                    //根据InTarget和OutTarget,修正最佳方向
                    if (lift.OutTargets.Count == 0)
                    {
                        if (lift.InTargets.All(it => it < lift.CurrentFloor))
                        {
                            lift.Direction = LiftDirectionEnum.Down;
                        }
                        else if (lift.InTargets.All(it => it > lift.CurrentFloor))
                        {
                            lift.Direction = LiftDirectionEnum.Up;
                        }
                    }
                    Console.WriteLine("Lift[{0}]: Running", lift.ID);
                }
                else
                {
                    lift.Status = LiftStatusEnum.Paused;
                    Console.WriteLine("Lift[{0}]: Paused", lift.ID);
                }

                if (lift.Status == LiftStatusEnum.OUT_IN)
                {
                    if (lift.InTargets.Contains(lift.CurrentFloor))
                    {
                        var passengers = lift.RequestInPassengers.Where(p => p.CurrentFloor == lift.CurrentFloor).ToList();

                        for (int i = 0; i < passengers.Count; i++)
                        {
                            var passenger = passengers[i];
                            Console.WriteLine("Lift[{0}]: Passenger[{1}] IN", lift.ID, passenger.ID);

                            lift.CurrentPeopleNum++;
                            lift.CurrentLoad += passenger.Weight;
                            if (!lift.OutTargets.Contains(passenger.TargetFloor))
                            {
                                lift.OutTargets.Add(passenger.TargetFloor);
                            }
                            lift.RequestOutPassengers.Add(passenger);

                            lift.RequestInPassengers.Remove(passenger);
                            lift.InTargets.Remove(lift.CurrentFloor);

                            passengers.Remove(passenger);

                            i--;

                            //没有新需求,电梯直接去接乘客
                            if (lift.InTargets.Count == 0)
                            {
                                if (lift.CurrentFloor == passenger.CurrentFloor)
                                {
                                    lift.Direction = passenger.Direction;
                                }
                            }
                        }
                    }

                    if (lift.OutTargets.Contains(lift.CurrentFloor))
                    {
                        var passengers = lift.RequestOutPassengers.Where(p => p.TargetFloor == lift.CurrentFloor).ToList();
                        for (int i = 0; i < passengers.Count; i++)
                        {
                            var passenger = passengers[i];
                            Console.WriteLine("Lift[{0}]: Passenger[{1}] OUT", lift.ID, passenger.ID);

                            lift.CurrentPeopleNum--;
                            lift.CurrentLoad -= passenger.Weight;

                            lift.RequestInPassengers.Remove(passenger);
                            lift.OutTargets.Remove(lift.CurrentFloor);
                            passengers.Remove(passenger);

                            i--;
                        }
                    }

                    if (!lift.InTargets.Any() && !lift.OutTargets.Any())
                    {
                        lift.Direction = LiftDirectionEnum.None;
                        lift.Status    = LiftStatusEnum.Paused;
                    }

                    //模拟乘客进出电梯的时间
                    Thread.Sleep(Constants.OutInInMS);
                    if (lift.Status == LiftStatusEnum.OUT_IN)
                    {
                        Console.WriteLine("Lift[{0}] is leaving {1}", lift.ID, lift.CurrentFloor);

                        lift.Status = LiftStatusEnum.Running;
                    }
                }

                if (lift.Status == LiftStatusEnum.Running)
                {
                    if (lift.Direction == LiftDirectionEnum.None)
                    {
                        lift.Direction = LiftDirectionEnum.Up;
                    }

                    //模拟上行或下行一层的时间
                    Thread.Sleep(Constants.OneFloorTimeInMS);

                    if (lift.Direction == LiftDirectionEnum.Up)
                    {
                        lift.CurrentFloor++;

                        if (lift.CurrentFloor == lift.Building.MaxFloor)
                        {
                            lift.Direction = LiftDirectionEnum.Down;
                        }
                    }
                    else if (lift.Direction == LiftDirectionEnum.Down)
                    {
                        lift.CurrentFloor--;

                        if (lift.CurrentFloor == lift.Building.MinFloor)
                        {
                            lift.Direction = LiftDirectionEnum.Up;
                        }
                    }
                }
                else
                {
                    //暂停中
                    Thread.Sleep(Constants.PausedLoopInMS);
                }
            }
        }