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