//Obtener de la memoria la lista de dispositivos conectados private List <String> ObtenerListaMacMemoria() { String log = string.Empty; String cadena; char[] caracterSeparador = { '&' }; List <String> respuesta = null; //Leer memoria if (!_memoriaCompartida.LeerEnMemoria(out cadena, true, ref log)) { //Error ControlLog.EscribirLog(ControlLog.TipoGravedad.WARNING, "Hilo.cs", "ObtenerListaMacMemoria", "Error al obtener datos de la memoria compartida: " + log); } else { //Convertir a lista respuesta = cadena.Split(caracterSeparador).ToList <String>(); } return(respuesta); }
//Código que ejecuta el hilo public void procedimientoHilo() { //Indica si ocurrió algún cambio de estado o no bool huboCambios = false; DateTime fechaHora = DateTime.Now; String msjError = String.Empty; //Obtener lista de conectados List <String> MacsConectadas = ObtenerListaMacMemoria(); //Verificar si hay datos if (MacsConectadas[0].Replace('\0', ' ').Trim() != String.Empty) { try { //Obtener la fecha y hora de última actualización fechaHora = ObtenerFechaHoraMemoria(MacsConectadas); //Determinar si no hay un desfasaje muy grande TimeSpan ts = DateTime.Now - fechaHora; //Diferencia en minutos double difMintos = ts.TotalMinutes; if (difMintos > 1) { //Si es mayor a un minuto advertir msjError = "Datos en memoria desactualizado"; } } catch (Exception ex) { //Error msjError = "Error al intentar leer la fecha"; ControlLog.EscribirLog(ControlLog.TipoGravedad.WARNING, "Hilo.cs", "procedimientoHilo", msjError + ": " + ex.Message); fechaHora = DateTime.Now; } } else { //Sin datos, no se inició la aplicación de Fuente u ocurrió un error msjError = "No se encontraron datos en la memoria"; MacsConectadas.RemoveAt(0); ControlLog.EscribirLog(ControlLog.TipoGravedad.WARNING, "Hilo.cs", "procedimientoHilo", msjError + ", no se inició la aplicación de Fuente u ocurrió un error en dicha aplicación."); } //Mostrar en la vista actualizarHoraMemoria(fechaHora, msjError); //Obtener una lista de todos los dispositivos conectados de la lista EstadosActuales, para verificar cuales ya no vinieron en la lista de conectados List <String> macsEstadosActuales = Core.obtenerListaMacsEstadosActuales(); foreach (string macActual in MacsConectadas) { //Quitar de la lista de macsEstadosActuales if (macsEstadosActuales.Contains(macActual)) { macsEstadosActuales.Remove(macActual); } //Verificar si ocurrio un cambio de estado, y realizar las acciones necesarias if (Core.verificarCambioEstado(macActual, true)) { huboCambios = true; } } //Recorrer los dispositivos que aún estan en la lista, para determinar si se acaban de desconectar foreach (string macActual in macsEstadosActuales) { //Verificar si ocurrio un cambio de estado, y realizar las acciones necesarias if (Core.verificarCambioEstado(macActual, false)) { huboCambios = true; } } //Actualizar lista de dispositivos conectados para mostrar al usuario if (huboCambios) { actualizarListaConectados(MacsConectadas); } }