public void addTarget(Station targetStation, byte carType) { switch (carType) { case 5: carTask = new CarTask(stationDic["F28"], targetStation, stationDic["F28"], carType); break; case 6: carTask = new CarTask(stationDic["F29"], targetStation, stationDic["F29"], carType); break; case 7: carTask = new CarTask(stationDic["F30"], targetStation, stationDic["F30"], carType); break; case 8: carTask = new CarTask(stationDic["F31"], targetStation, stationDic["F31"], carType); break; default: return; } if (carTask != null) { mutexCar.WaitOne(); if (!carTaskQueues[carType].Contains(carTask)) { carTaskQueues[carType].Enqueue(carTask); } mutexCar.ReleaseMutex(); //mutexCar.WaitOne(); //if (carTaskQueues[carType].Count == 0) //{ // carTaskQueues[carType].Enqueue(carTask); // if (carQueues[carTaskQueues[carType].First().CarType].Count > 0) // { // MainGUI.RoadTableFrameHandler serialHander = new MainGUI.RoadTableFrameHandler(); // if (carQueues[carTaskQueues[carType].First().CarType].First() != null) // { // byte taskLen = serialHander.planRoadTable(mappingRoute, carQueues[carTaskQueues[carType].First().CarType].First().CarID, carTask.StartStation, carTask.TargetStation, carTask.EndStation, this.adjList, this.sp, stationDic); // } // } //} //else if (!carTaskQueues[carType].Contains(carTask)) //{ // carTaskQueues[carType].Enqueue(carTask); //} //mutexCar.ReleaseMutex(); } }
public override bool Equals(object obj) { CarTask task = (CarTask)obj; if (task.carType == this.carType) { if (task.endStation == this.endStation) { if (task.startStation == this.startStation) { if (task.targetStation == this.targetStation) { return(true); } } } } return(false); }
private void runCarThread(object o) { int reSend = 3; CarTask carTask = (CarTask)o; Track trackTogo = new Track(); int i; Queue <Car> carQueue = carQueues[carTask.CarType]; if (carQueue.Count == 0) { return; } if (carTask.TargetStation == null || (carTask.StartStation.Equals(carTask.TargetStation))) { return; } List <Track> list1 = adjList.FindWay(adjList.Find(carTask.StartStation), adjList.Find(carTask.TargetStation)); List <Track> list2 = adjList.FindWay(adjList.Find(carTask.TargetStation), adjList.Find(stationDic["F32"])); List <Track> list3 = adjList.FindWay(adjList.Find(stationDic["F32"]), adjList.Find(carTask.EndStation)); List <Track> list = new List <Track>(50); list.AddRange(list1); list.AddRange(list2); list.AddRange(list3); List <byte> cardList = new List <byte>(50); foreach (Track t in list) { cardList.Add(stationDic[t.EndStation].CardID); } Car car = null; mutexCar.WaitOne(); if (carQueue.Count > 0) { car = carQueue.Dequeue(); } else { return; } mutexCar.ReleaseMutex(); car.TargetStation = carTask.TargetStation; carTask.StartStation.OccupiedCar = null; while (car.status != 0x53) { Thread.Sleep(200); } RoadTableFrameHandler serialHander = new RoadTableFrameHandler(); car.taskLen = serialHander.planRoadTable(car.CarID, carTask.StartStation, carTask.TargetStation, carTask.EndStation, this.adjList, this.sp, stationDic); Thread.Sleep(5000); while (!car.remoteReady()) { serialHander.planRoadTable(car.CarID, carTask.StartStation, carTask.TargetStation, carTask.EndStation, this.adjList, this.sp, stationDic); Thread.Sleep(5000); --reSend; if (reSend == 0) { sp.Close(); Thread.Sleep(1000); sp.Open(); reSend = 3; } } car.permitPass(sp); for (i = 0; i < list.Count; i++) { Track t = list[i]; while (true) { mutexStationTarget.WaitOne(); if (stationDic[t.StartStation].CardID == car.posCard || 0 == i || (cardList.IndexOf(car.posCard) >= i && cardList.IndexOf(car.posCard) <= i + 4)) { if (t.StartStation == car.TargetStation.name || t.StartStation == "F32") { if (car.posCard == car.TargetStation.CardID || car.posCard == stationDic["F32"].CardID) { while (car.status == 0x53) { Thread.Sleep(200); } } } if (stationDic[t.EndStation].targeted == false) { stationDic[t.EndStation].targeted = true; car.permitPass(sp); if (car.lastStation != null) { car.lastStation.targeted = false; } car.lastStation = stationDic[t.EndStation]; mutexStationTarget.ReleaseMutex(); break; } else { car.forbidPass(sp); } } mutexStationTarget.ReleaseMutex(); Thread.Sleep(200); } trackTogo.clear(); trackTogo.TrackPointList.AddRange(t.TrackPointList); car.run(trackTogo); } car.RealState = CarState.CarStop; car.TargetStation = null; mutexCar.WaitOne(); car.remoteTaskLen = 0; car.taskLen = 0; carTask.EndStation.OccupiedCar = car; carQueue.Enqueue(car); mutexCar.ReleaseMutex(); }