bool tryToMove() { if (endOfRoad(pos_X, pos_Y, road)) { return(false); } //wykonaj ruch jeżeli możesz if (road.straightRoad(pos_X, pos_Y)) { singleMove(); } else { //crossing rules roadGod.Wait(); getRightCarPositions(pos_X, pos_Y); bool lanePassPermission = false; road.getOnlyOneMutex(crossingPos).WaitOne(); lanePassPermission = road.getOnlyOne(crossingPos); road.getOnlyOneMutex(crossingPos).ReleaseMutex(); if (lanePassPermission) { if (carDir == CarDirection.TURN_RIGHT) { //singleMove(); if (singleMove()) { road.getOnlyOneMutex(crossingPos).WaitOne(); lanePassPermission = road.getOnlyOne(crossingPos); road.setOnlyOne(crossingPos, false); road.getOnlyOneMutex(crossingPos).ReleaseMutex(); } //..^-..ZABLOKUJ PAS } else { //otworz mutex sasiada i zamknij go dopiero po rozpatrzeniu calej skewencji ruchu // road.GetRoadMutex(rightPosX, rightPosY).WaitOne(); // road.GetRoadMutex(12, 12).WaitOne(); road.GetRoadMutex(13, 12).WaitOne(); road.GetRoadMutex(12, 13).WaitOne(); road.GetRoadMutex(13, 13).WaitOne(); if ((!road.checkSpace(rightPosX, rightPosY)) && roadWithoutPrio()) { //warunek- jeśli po twojej prawej jest false, to znaczy ze ktos tam stoi //hierarchia zasobów- zignoruj to że ktoś stoi bo pas na którym jesteś ma pierwszeństwo //wait for your turn } else { //youCanTryDrive(); int ccNumber = 0; if (!road.checkSpace(12, 12)) { ccNumber++; } if (!road.checkSpace(13, 12)) { ccNumber++; } if (!road.checkSpace(12, 13)) { ccNumber++; } if (!road.checkSpace(13, 13)) { ccNumber++; } //!!!!!!!!!...w tym miejscu trzeba trzymac zalokowany mutex drogi na którą się wybiera nasz auto //puszczamy dopiero po skonczeniu ruchu auta if (ccNumber >= 3) { //u cant drive } else { //kolizje hipotetyczne if (!roadWithoutPrio()) { //przy wykrywaniu kolizji powinien byc tryb z tylko jedna droga pierwszenstwa //dwie dorgi z pierwszeństwem poskutkowałyby podwójnym losowaniem czy zaszła kolizja int ccNumber2 = 0; if (!road.checkSpace(12, 12) || getCarDecision()) { ccNumber2++; } if (!road.checkSpace(13, 12) || getCarDecision()) { ccNumber2++; } if (!road.checkSpace(12, 13) || getCarDecision()) { ccNumber2++; } if (!road.checkSpace(13, 13) || getCarDecision()) { ccNumber2++; } if (ccNumber2 == 4) { road.getCrossingCarsNumberMutex().WaitOne();//bad name but already existed road.incCrossingCarsNumber(); road.getCrossingCarsNumberMutex().ReleaseMutex(); } //co z przypadkiem keidy choc jedno auto skreca w prawo? //komu to sprawdzac- wszelkim autom na skrzyżowaniu? } //u can drive singleMove(); } } road.GetRoadMutex(13, 13).ReleaseMutex(); road.GetRoadMutex(12, 13).ReleaseMutex(); road.GetRoadMutex(13, 12).ReleaseMutex(); road.GetRoadMutex(12, 12).ReleaseMutex(); //roadGod.Release(); } } else { //wait for your turn } roadGod.Release(); } //car after trying to move correctRotation(pos_X, pos_Y, carDestination); return(true); }
public void ProgramGUI() { simRoad = new Road(); //StartThreads(); Thread generator = new Thread(new ThreadStart(GenerateCarsProc)); generator.Start(); Application.Init(); var top = Application.Top; // Creates a menubar f9 var menu = new MenuBar(new MenuBarItem[] { new MenuBarItem("_F9 Menu", new MenuItem [] { new MenuItem("_Quit", "", () => { top.Running = false; }), new MenuItem("_StopCars", "", () => { setPrun(false); }), }), }); top.Add(menu); //Simulation window var win = new Window("Crossing Problem") { X = 0, Y = 1, Width = Dim.Fill(), Height = Dim.Fill() }; //dodanie poszczegolnych elementow addBoundaries(win); // var testLabel = new Label(myCar.getGraphic()) // { // X = myCar.getPosX(), // Y = myCar.getPosY() // }; //win.Add(testLabel); DateTime start = DateTime.Now; //Main loop, update data here bool timer(MainLoop caller) { win.RemoveAll(); addBoundaries(win); //get dangerous data from??? //updateInfo(0, pb_0, philosopherStatus_0); // updateForks(0, forkLabel_0); //powinno byc zabezpieczone! //remove not existing/dead cars foreach (Car singleCar in cars.ToArray()) { if (singleCar.checkIfCarExists() == false) { simRoad.pushCharacter(singleCar.getGraphic()); cars.Remove(singleCar); } } //print existing ones foreach (Car singleCar in cars.ToArray()) { var singleCarLabel = new Label(singleCar.getGraphic()) { X = singleCar.getPosX(), Y = singleCar.getPosY(), ColorScheme = new ColorScheme() { Normal = singleCar.getCarColor() }, }; win.Add(singleCarLabel); } //nieodpowiednie nazwy zmiennych, odpowiednie dzialanie int ccNumber = 0; simRoad.getCrossingCarsNumberMutex().WaitOne(); ccNumber = simRoad.getCrossingCarsNumber(); simRoad.getCrossingCarsNumberMutex().ReleaseMutex(); var ccNumberLabel = new Label("Liczba kolizji: " + ccNumber) { X = 28, Y = 5 }; win.Add(ccNumberLabel); DateTime end = DateTime.Now; TimeSpan ts = (end - start); var timeLabel = new Label("Czas symulacji: " + ts.Duration().TotalSeconds + "[s]")//+ " : "+ ts.Seconds { X = 28, Y = 7 }; win.Add(timeLabel); //update graphics + generate new cars? return(true); } Application.MainLoop.AddTimeout(TimeSpan.FromMilliseconds(100), timer); top.Add(win); Application.Run(); }