Beispiel #1
0
        public void ResetData()
        {
            AbortThreads();
            BusyPlaces = 0;
            EntranceStadiumQueue.Clear();
            _securityThreads = new List <Thread>();
            for (int i = 0; i < CountSecurity; i++)
            {
                _securityThreads.Add(new Thread(CheckTicket)
                {
                    Name = $"Security {i}."
                });
            }

            _stewardThreads = new List <Thread>();
            for (int i = 0; i < CountSteward; i++)
            {
                _stewardThreads.Add(new Thread(FanAccommodationBySector)
                {
                    Name = $"Steward {i}."
                });
            }

            for (ushort i = 0; i < StadiumEntrance; i++)
            {
                EntranceSectorsQueue[i].Clear();
            }

            for (ushort i = 0; i < CountSectors; i++)
            {
                SectorsPlaces[i].FansInSector.Clear();
            }
        }
Beispiel #2
0
        public void CheckTicket()
        {
            try
            {
                bool IsStadiumFull = false;
                while (!IsStadiumFull)
                {
                    try
                    {
                        Fan  fan                       = null;
                        bool isTicketValid             = false;
                        int  EntranceSectorsQueueCount = 0;
                        bool hasFanInFifstQueue        = false;
                        this.Dispatcher.Invoke(() =>
                        {
                            hasFanInFifstQueue = EntranceSectorsQueue.Count > 0 ? true : false;
                        });

                        this.Dispatcher.Invoke(() =>
                        {
                            lock (_entranceStadiumQueueLocker)
                            {
                                if (EntranceStadiumQueue.Count > 0)
                                {
                                    fan = EntranceStadiumQueue.Take(1).First <Fan>();
                                    EntranceStadiumQueue.Remove(fan);
                                }
                            }
                            if (fan != null)
                            {
                                isTicketValid             = IsTicketValid(fan);//Todo: maybe change later to have better multythread.
                                EntranceSectorsQueueCount = EntranceSectorsQueue.Count;
                            }
                        });

                        if (fan != null && isTicketValid)
                        {
                            int mostShortQueueIndex  = 0;
                            int mostShortQueueLength = int.MaxValue;

                            for (int i = 0; i < EntranceSectorsQueueCount; i++)
                            {
                                this.Dispatcher.Invoke(() =>
                                {
                                    if (EntranceSectorsQueue[i].Count < mostShortQueueLength)
                                    {
                                        mostShortQueueLength = EntranceSectorsQueue[i].Count;
                                        mostShortQueueIndex  = i;
                                    }
                                });
                            }
                            this.Dispatcher.Invoke(() =>
                            {
                                if (!this.IsStadiumFull())
                                {
                                    EntranceSectorsQueue[mostShortQueueIndex].Add(fan);
                                }
                            });
                        }
                    }
                    catch (Exception e)
                    {
                        MessageBox.Show(e.Message);
                    }
                    Thread.Sleep(SecuritySleep);
                    this.Dispatcher.Invoke(() =>
                    {
                        IsStadiumFull = this.IsStadiumFull();
                    });
                }
            }
            catch (ThreadAbortException ex)
            {
            }
            finally
            {
                MessageBox.Show(Thread.CurrentThread.Name + "  EndWork");
            }
        }