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; } }
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; } }