Esempio n. 1
0
        /// <summary>
        /// Método responsável por executar a contagem dos votos e da impressão parcial.
        /// </summary>
        public void Run()
        {
            int counter = 0;

            for (int i = firstPos; i < lastPos; i++)
            {
                votesCounted[votes[i]]++;   // Adiciona um voto para o canditado votes[i]

                counter++;
                if (counter % numberVotesPartial == 0) // Verifica se não contou o número necessários de votos para a impressão parcial
                {
                    VoteCounter.PrintStatus(this);     // Imprime o resultado parcial
                    barrier.SignalAndWait();           // Aguarda o término das outras threads para voltar a contar os votos
                }
            }
        }
Esempio n. 2
0
 /// <summary>
 /// Método estático para impressão de forma sincronizada dos resultados contabilizados por um VoteCounter
 /// </summary>
 /// <param name="vc">objeto na qual se deseja saber o resultado</param>
 public static void PrintStatus(VoteCounter vc)
 {
     Monitor.Enter(Lock);    // Thread tenta pegar o lock
     try
     {
         System.Console.WriteLine(vc.Name + ":");
         for (int i = 0; i < vc.NumberCandidates; i++)
         {
             System.Console.WriteLine("   Candidate " + i + ": " + vc.CandidateVotesCounted(i) + " votes.");
         }
     }
     finally                 // Bloco finally para garantir a liberação do lock em caso de erro
     {
         Monitor.Exit(Lock); // Thread libera o lock
     }
 }