public override void stop()
        {
            int ret;

            // Causo l'uscita dal thread ed aspetto
            isTimeToDie = true;
            if (captureThread != null)
            {
                captureThread.Join();
                captureThread = null;
            }

            if (dbHandle != IntPtr.Zero)
            {
                ret      = zkfp2.DBFree(dbHandle);
                dbHandle = IntPtr.Zero;
                if (ret == zkfp.ZKFP_ERR_OK)
                {
                    _giornale.Info("Release della cache ok");
                }
                else
                {
                    Console.Error.WriteLine("Release cache : err=" + ret + " : " + ZKErrors.getDescrizione(ret));
                }
            }

            // Inizializza il device che deve essere connesso, altrimenti da errore
            if (deviceHandle != IntPtr.Zero)
            {
                ret          = zkfp2.CloseDevice(deviceHandle);
                deviceHandle = IntPtr.Zero;
                if (ret == zkfp.ZKFP_ERR_OK)
                {
                    _giornale.Info("Chiusura device handle ok");
                }
                else
                {
                    _giornale.Error("Chiusura device handle : err=" + ret + " : " + ZKErrors.getDescrizione(ret));
                }
            }

            // Rilascia le risorse utilizzate dalla libreria
            ret = zkfp2.Terminate();
            if (ret == zkfp.ZKFP_ERR_OK)
            {
                Console.Out.WriteLine("Terminate ok");
            }
            else
            {
                _giornale.Error("Terminate : err=" + ret + " : " + ZKErrors.getDescrizione(ret));
            }


            base.stop();
        }
        public override void start()
        {
            bool tuttoBene = true;

            statoRun    = StatoRun.Stopped;
            infoScanner = null;

            try {
                int ret = zkfp2.Init();

                if (ret == zkfperrdef.ZKFP_ERR_OK)
                {
                    _giornale.Info("Inizializzato scanner ok");
                }
                else
                {
                    tuttoBene = false;
                    _giornale.Error("err=" + ret + " : " + ZKErrors.getDescrizione(ret));
                }
            } catch (Exception) {
                tuttoBene = false;
                String msg = "I driver dello scanner di imporonte digitali ZK Teco 4500 non sono installati.";
                if (Lumen.Config.Configurazione.UserConfigLumen.scannerImpronteGestito)
                {
                    _giornale.Error(msg + "  Impossibile avviare il servizio");
                }
                else
                {
                    _giornale.Debug(msg + " Poco male tanto non lo uso");
                }
                return;
            }

            // Apro il device
            int idx = 0;

            if (tuttoBene)
            {
                if (IntPtr.Zero == (deviceHandle = zkfp2.OpenDevice(idx)))
                {
                    tuttoBene = false;
                    _giornale.Error("Open device " + idx + " fallita");
                }
                else
                {
                    _giornale.Info("Open device connessione ok");
                }
            }

            // Inizializzo la cache
            if (tuttoBene)
            {
                if (IntPtr.Zero == (dbHandle = zkfp2.DBInit()))
                {
                    _giornale.Error("Inizializzazione cache fallita");
                    tuttoBene = false;
                }
                else
                {
                    _giornale.Info("Inizializzazione cache ok");
                }
            }

            if (tuttoBene)
            {
                try {
                    LeggiParametriScanner();
                } catch (Exception ee) {
                    tuttoBene = false;
                    _giornale.Fatal("Lettura parametri scanner", ee);
                }
            }


            if (tuttoBene)
            {
                base.start();
            }
            else
            {
                zkfp2.Terminate();
            }
        }