private void ChoiceProxyListenerThread(ChoiceListenerThreadParameters para)
 {
     game.RegisterCurrentThread();
     try
     {
         List <List <Card> > answer;
         if (para.proxy.TryAskForCardChoice(para.places, para.resultMax, para.verifier, out answer, para.options, null))
         {
             semAccess.WaitOne();
             if (answer != null && answer.Count != 0 && answer[0] != null && answer[0].Count == para.resultMax[0])
             {
                 answerHero.Add(para.player, answer[0]);
             }
             semAccess.Release();
         }
         if (!semDone.WaitOne(0))
         {
             Trace.TraceInformation("All done");
             semWake.Release(1);
         }
     }
     catch (Exception)
     {
     }
 }
        public void AskForHeroChoice(Dictionary <Player, List <Card> > restDraw, Dictionary <Player, List <Card> > heroSelection, int numberOfHeroes, ICardChoiceVerifier verifier)
        {
            proxyListener = new Dictionary <Player, Thread>();
            semAccess     = new Semaphore(1, 1);
            semWake       = new Semaphore(0, 2);
            semDone       = new Semaphore(restDraw.Count - 1, restDraw.Count);
            answerHero    = heroSelection;
            DeckType temp = DeckType.Register("Temp");

            foreach (var player in Game.CurrentGame.Players)
            {
                if (!proxy.ContainsKey(player) || !restDraw.ContainsKey(player))
                {
                    continue;
                }
                ChoiceListenerThreadParameters para = new ChoiceListenerThreadParameters();
                para.proxy    = proxy[player];
                para.verifier = verifier;
                para.player   = player;
                para.places   = new List <DeckPlace>()
                {
                    new DeckPlace(player, temp)
                };
                para.options   = null;
                para.resultMax = new List <int> {
                    numberOfHeroes
                };
                Game.CurrentGame.Decks[player, temp].Clear();
                Game.CurrentGame.Decks[player, temp].AddRange(restDraw[player]);
                Thread t = new Thread(
                    (ParameterizedThreadStart)
                    ((p) =>
                {
                    ChoiceProxyListenerThread((ChoiceListenerThreadParameters)p);
                }))
                {
                    IsBackground = true
                };
                t.Start(para);
                proxyListener.Add(player, t);
            }
            if (!semWake.WaitOne(TimeOutSeconds * 1000))
            {
                semAccess.WaitOne(0);
            }

            foreach (var pair in proxyListener)
            {
                pair.Value.Abort();
            }
        }
Example #3
0
 private void ChoiceProxyListenerThread(ChoiceListenerThreadParameters para)
 {
     game.RegisterCurrentThread();
     List<List<Card>> answer;
     if (para.proxy.TryAskForCardChoice(para.places, para.resultMax, para.verifier, out answer, para.options, null))
     {
         semAccess.WaitOne();
         if (answer != null && answer.Count != 0 && answer[0] != null && answer[0].Count == para.resultMax[0])
         {
             answerHero.Add(para.player, answer[0]);
         }
         semAccess.Release();
     }
     if (!semDone.WaitOne(0))
     {
         Trace.TraceInformation("All done");
         semWake.Release(1);
     }
 }
Example #4
0
        public void AskForHeroChoice(Dictionary<Player, List<Card>> restDraw, Dictionary<Player, List<Card>> heroSelection, int numberOfHeroes, ICardChoiceVerifier verifier)
        {
            proxyListener = new Dictionary<Player, Thread>();
            semAccess = new Semaphore(1, 1);
            semWake = new Semaphore(0, 2);
            semDone = new Semaphore(proxy.Count - 2, proxy.Count - 1);
            answerHero = heroSelection;
            DeckType temp = new DeckType("Temp");
            foreach (var player in Game.CurrentGame.Players)
            {
                if (!proxy.ContainsKey(player) || player.Role == Role.Ruler)
                {
                    continue;
                }
                ChoiceListenerThreadParameters para = new ChoiceListenerThreadParameters();
                para.proxy = proxy[player];
                para.verifier = verifier;
                para.player = player;
                para.places = new List<DeckPlace>() { new DeckPlace(player, temp) };
                para.options = null;
                para.resultMax = new List<int> { numberOfHeroes };
                Game.CurrentGame.Decks[player, temp].Clear();
                Game.CurrentGame.Decks[player, temp].AddRange(restDraw[player]);
                Thread t = new Thread(
                    (ParameterizedThreadStart)
                    ((p) =>
                    {
                        ChoiceProxyListenerThread((ChoiceListenerThreadParameters)p);
                    })) { IsBackground = true };
                t.Start(para);
                proxyListener.Add(player, t);
            }
            if (!semWake.WaitOne(TimeOutSeconds * 1000))
            {
                semAccess.WaitOne(0);
            }

            foreach (var pair in proxyListener)
            {
                pair.Value.Abort();
            }
        }