コード例 #1
0
ファイル: Game.cs プロジェクト: micahpaul/dominion_net_multi
		public void StartAsync()
		{
			try
			{
				this.AIThreads = new List<Thread>();
				foreach (DominionBase.Players.Player aiPlayer in this.Players.Where(p => p.PlayerType == PlayerType.Computer))
				{
					Thread t = new Thread(aiPlayer.StartAsync);
					this.AIThreads.Add(t);
					t.Start();
					int counter = 0;
					while (((DominionBase.Players.AI.IComputerAI)aiPlayer).State != DominionBase.Players.AI.AIState.Running)
					{
						counter++;
						if (counter > 20)
							throw new GameCreationException("AI player did not register soon enough!");
						Thread.Sleep(250);
					}
				}

				Thread startingThread = null;
				_ShouldStop = true;
				if (this.State != GameState.Ended)
				{
					this.State = GameState.Running;
					_ShouldStop = false;
					startingThread = SetNextPlayer();
				}

				while (!_ShouldStop)
				{
					if (startingThread != null)
						startingThread.Start();
					WaitEvent.WaitOne();
					startingThread = null;

					while (true)
					{
						GameMessage message = null;
						// Making this lock section as small as possible
						lock (this.MessageRequestQueue)
						{
							if (this.MessageRequestQueue.Count > 0)
								message = this.MessageRequestQueue.Dequeue();
							else
								break;
						}

						//System.Diagnostics.Trace.WriteLine(String.Format("Message: {0}", message.Message));
						GameMessage response = new GameResponseMessage();
						response.Message = "ACK";

						try
						{
							message.ActBefore(this);
						}
						catch (NullReferenceException nre)
						{
							if (!_ShouldStop)
								throw nre;
						}

						lock (_MessageResponseQueue)
						{
							_MessageResponseQueue.Enqueue(response);
						}
						if (message.WaitCallback != null)
							message.WaitCallback(null);

						Thread t = null;

						if (message.CheckEndGame && IsEndgameTriggered)
							_ShouldStop = true;
						else
							t = message.ActAfter(this);

						if (t != null)
							startingThread = t;
					}
				}

				End();
			}
			catch (Exception ex)
			{
				Utilities.Logging.LogError(ex);
				throw;
			}
		}
コード例 #2
0
        public void StartAsync()
        {
            try
            {
                this.AIThreads = new List <Thread>();
                foreach (DominionBase.Players.Player aiPlayer in this.Players.Where(p => p.PlayerType == PlayerType.Computer))
                {
                    Thread t = new Thread(aiPlayer.StartAsync);
                    this.AIThreads.Add(t);
                    t.Start();
                    int counter = 0;
                    while (((DominionBase.Players.AI.IComputerAI)aiPlayer).State != DominionBase.Players.AI.AIState.Running)
                    {
                        counter++;
                        if (counter > 20)
                        {
                            throw new GameCreationException("AI player did not register soon enough!");
                        }
                        Thread.Sleep(250);
                    }
                }

                Thread startingThread = null;
                _ShouldStop = true;
                if (this.State != GameState.Ended)
                {
                    this.State     = GameState.Running;
                    _ShouldStop    = false;
                    startingThread = SetNextPlayer();
                }

                while (!_ShouldStop)
                {
                    if (startingThread != null)
                    {
                        startingThread.Start();
                    }
                    WaitEvent.WaitOne();
                    startingThread = null;

                    while (true)
                    {
                        GameMessage message = null;
                        // Making this lock section as small as possible
                        lock (this.MessageRequestQueue)
                        {
                            if (this.MessageRequestQueue.Count > 0)
                            {
                                message = this.MessageRequestQueue.Dequeue();
                            }
                            else
                            {
                                break;
                            }
                        }

                        //System.Diagnostics.Trace.WriteLine(String.Format("Message: {0}", message.Message));
                        GameMessage response = new GameResponseMessage();
                        response.Message = "ACK";

                        try
                        {
                            message.ActBefore(this);
                        }
                        catch (NullReferenceException nre)
                        {
                            if (!_ShouldStop)
                            {
                                throw nre;
                            }
                        }

                        lock (_MessageResponseQueue)
                        {
                            _MessageResponseQueue.Enqueue(response);
                        }
                        if (message.WaitCallback != null)
                        {
                            message.WaitCallback(null);
                        }

                        Thread t = null;

                        if (message.CheckEndGame && IsEndgameTriggered)
                        {
                            _ShouldStop = true;
                        }
                        else
                        {
                            t = message.ActAfter(this);
                        }

                        if (t != null)
                        {
                            startingThread = t;
                        }
                    }
                }

                End();
            }
            catch (Exception ex)
            {
                Utilities.Logging.LogError(ex);
                throw;
            }
        }