示例#1
0
        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);
        }
示例#2
0
        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();
        }