private string EventualeTagDaImpronta(FileInfo finfo) { string tag = null; // Devo cercare se nella lista delle persone sconosciute esiste un record // dello stesso range temporale della foto (compreso dei secondi di scarto configurati) for (int ii = 0; ii < personeSconosciute.Count; ii++) { Sconosciuto sconosciuto = personeSconosciute[ii]; // Timestamp di quando è stata scansionata l'impronta DateTime tempoImpronta = sconosciuto.tempo; // Timestamp di quando è stata scattata la foto (e trasferita sul pc) DateTime tempoFoto = finfo.CreationTime; if (tempoFoto >= tempoImpronta.AddSeconds(userConfigOnRide.secDiscesaMin) && tempoFoto <= tempoImpronta.AddSeconds(userConfigOnRide.secDiscesaMax) ) { // Ok associo tag = sconosciuto.nome; personeSconosciute.RemoveAt(ii); break; } } return(tag); }
/// <summary> /// La collezione con le impronte degli sconosciuti, potrebbe /// crescere a dismisura, nel caso in cui falliscano gli abbinamenti con le fotografie per diverso tempo. /// Per evitare di accumulare oggetti inutili, svecchio la collezione /// </summary> void FreeMemSconosciutiVecchi() { bool restaQui; StrategiaPuliziaImpronte strategia = StrategiaPuliziaImpronte.Casaccio; // Scelgo un tempo abbastanza ampio per dichiarare come "vecchia" una impronta. // Prendo 20 volte il tempo massimo impostato per la discesa. int tempoMax = userConfigOnRide.secDiscesaMax * 10; do { restaQui = false; for (int ii = 0; ii < personeSconosciute.Count; ii++) { Sconosciuto sconosciuto = personeSconosciute[ii]; DateTime adesso = DateTime.Now; if (sconosciuto.tempo.AddSeconds(tempoMax) < adesso) { if (strategia == StrategiaPuliziaImpronte.Cancella) { personeSconosciute.RemoveAt(ii); restaQui = true; break; } if (strategia == StrategiaPuliziaImpronte.Casaccio) { // Cerco la prima foto acquisita su questo scivolo dopo la data indicata e non ancora taggata using (new UnitOfWorkScope()) { DateTime oraProvaMin = sconosciuto.tempo.AddSeconds(userConfigOnRide.secDiscesaMin); DateTime oraProvaMax = sconosciuto.tempo.AddSeconds(userConfigOnRide.secDiscesaMax * 4); var foto = UnitOfWorkScope.currentDbContext.Fotografie .Where(f => f.fotografo_id == fotografoOnRide.id && f.didascalia == null && f.dataOraAcquisizione > oraProvaMin && f.dataOraAcquisizione < oraProvaMax && f.giornata == sconosciuto.tempo.Date) .OrderByDescending(f => f.dataOraAcquisizione) .FirstOrDefault(); if (foto != null) { foto.didascalia = sconosciuto.nome; UnitOfWorkScope.currentDbContext.SaveChanges(); personeSconosciute.RemoveAt(ii); restaQui = true; break; // esco dal ciclo for } } } } } } while(restaQui); }
void OnImprontaAcquisita(object sender, ScansioneEvent eventArgs) { if (eventArgs.isValid) { ++totImpronteAcquisite; _giornale.Info("Impronta acquisita. Valida = " + eventArgs.isValid + eventArgs.bmpFileName); // Per svincolare il thread chiamante, mi creo una lista mia di sconosciuti da identificare. // Lo faccio perché ora devo chiamare un altro servizio in rete che potrebbe perdere tempo, // e quindi voglio ridare il controllo subito per evitare piantamenti Sconosciuto sconosciuto = new Sconosciuto { tempo = eventArgs.tempo, base64Template = eventArgs.strBase64Template, nome = null }; Application.Current.Dispatcher.BeginInvoke( new Action(() => { personeSconosciute.Add(sconosciuto); })); // fileNameBmpImpronta = eventArgs.bmpFileName; } }