예제 #1
0
        static void Main(string[] args)
        {
            var corConsoleDefault = Console.ForegroundColor;
            var repositorio       = new DigitaisRepositorio();
            var handler           = new IdentificarBiometriaHandler();

            var numeroTotalBiometrias = repositorio.RecuperarNumeroTotalBiometrias();
            var biometriasPorPagina   = (numeroTotalBiometrias / 10) + 10;

            for (int pagina = 1; pagina <= 10; pagina++)
            {
                var biometriasRecuperadas = repositorio.RecuperarPagina(pagina, biometriasPorPagina);
                Console.WriteLine($"Thread {pagina} trabalhará com {biometriasRecuperadas.Count()} biometrias...");
                handler.AdicionarMecanismoBuscaPara(biometriasRecuperadas);
            }

            var possoSair = false;

            while (!possoSair)
            {
                Console.WriteLine("Informe a digital");

                var         nitgen     = new NBioBSP();
                IFPData     data       = nitgen.FPData;
                IDevice     device     = nitgen.Device;
                IExtraction extraction = nitgen.Extraction;

                device.Open(255);
                extraction.Capture();
                var template = extraction.FIR;
                device.Close(255);

                var relogio = new Stopwatch();
                relogio.Start();
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Identificando.....");
                Console.ForegroundColor = corConsoleDefault;
                var resultado = handler.IdentificarBiometriaComCarga(template);
                relogio.Stop();
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine($"Id digital encontrada {resultado} em {relogio.Elapsed.TotalSeconds} segundos");
                Console.ForegroundColor = corConsoleDefault;

                Console.WriteLine();

                Console.WriteLine("\nCapturar nova digital?");
                var tecla = Console.ReadKey();
                if (tecla.Key == ConsoleKey.N)
                {
                    possoSair = true;
                }
            }
        }
        public int IdentificarBiometriaSemCarga(byte[] template)
        {
            var relogio = new Stopwatch();

            relogio.Start();
            Console.WriteLine($"Localizando digital ...");
            var repositorio = new DigitaisRepositorio();

            var tasks = new Dictionary <Guid, Task <int> >();
            var numeroTotalBiometrias = repositorio.RecuperarNumeroTotalBiometrias();

            Console.WriteLine($"Abrindo {Environment.ProcessorCount} threads...");
            var biometriasPorPagina = (numeroTotalBiometrias / Environment.ProcessorCount) + 10;

            for (int pagina = 1; pagina <= Environment.ProcessorCount; pagina++)
            {
                var biometriasRecuperadas = repositorio.RecuperarPagina(pagina, biometriasPorPagina);
                var buscaNitgen           = NitgenBiometriaTask.Novo(biometriasRecuperadas);
                var task = buscaNitgen.CriarTaskParaIdentificacaoBiometrica(template, biometriasRecuperadas);
                //tasks.TryAdd(buscaNitgen.Id, task);
                tasks.Add(buscaNitgen.Id, task);
                task.Start();
            }

            // var cancelation = new CancellationTokenSource();
            //Task.WaitAll(tasks.Select(t => t.Value).ToArray(), cancelation.Token);

            while (tasks.Count() > 0)
            {
                //var indice = Task.WaitAny(tasks.Select(t => t.Value).ToArray());
                var indice = Task.WaitAny(tasks.Select(t => t.Value).ToArray());
                //resultado = tasks.Select(t => t.Value).ElementAt(indice).Result;
                var resultado = tasks.ElementAt(indice);

                Console.WriteLine($"{resultado.Key} - Terminou com {resultado.Value.Result}");

                if (resultado.Value.Result > 0)
                {
                    relogio.Stop();
                    Console.WriteLine($"Localizada digital em > {relogio.Elapsed.TotalSeconds} segundos");
                    return(resultado.Value.Result);
                }

                tasks.Remove(resultado.Key);
            }

            relogio.Stop();
            Console.WriteLine($"Nenhuma digital localizada em > {relogio.Elapsed.TotalSeconds} segundos");
            return(0);

            //var resultado = tasks.FirstOrDefault(x => x.Value.Status == TaskStatus.RanToCompletion && x.Value.Result > 0);

            //var biometria = resultado.Key == Guid.Empty
            //    ? 0
            //    : resultado.Value.Result;

            //foreach (var item in tasks)
            //{
            //    item.Value.Dispose();
            //}
            //return biometria;
        }