Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Hartigan en 26 Agosto 2010, 14:16 pm



Título: Dudas con mi agenda!! c#.
Publicado por: Hartigan en 26 Agosto 2010, 14:16 pm
Buenas de nuevo, os comento porque me han surgido varias dudas.

El caso es que en mi agenda he creado un formulario para crear alarmas. Cada alarma tiene una fecha y hora de inicio, y además se establecen propiedades de recurrencia, es decir cuando queremos que se repita esa alarma. Entonces como puedo gestionar todo esto????

Es decir he de crear un timer para cada alarma y que esté continuamente comprobando con la hora local??? o como puedo hacerlo???

Gracias.


Título: Re: Dudas con mi agenda!! c#.
Publicado por: [D4N93R] en 26 Agosto 2010, 14:30 pm
Lo mejor es que crees un servicio de windows..  :D De esa forma siempre va a estar corriendo..

Saludos!


Título: Re: Dudas con mi agenda!! c#.
Publicado por: Hartigan en 26 Agosto 2010, 14:44 pm
Lo mejor es que crees un servicio de windows..  :D De esa forma siempre va a estar corriendo..

Saludos!

???, y creo un servicio que lleve a cabo todas las alarmas???? o creo un servicio por cada alarma?? o como??

Esque no es demasiado caótico tener por ejemplo 500 servicios??? uno por cada alarma?


Título: Re: Dudas con mi agenda!! c#.
Publicado por: KuraraGNU en 26 Agosto 2010, 17:11 pm
vamos a ver, ¿qué hace exactamente un timer? Quizás no tienes por qué usarlo, simplemente crea un dato que contenga el datatime.now y cuando establezcas la hora a la que quieres que salte la alarma haces una condición que salte al ser los dos datos iguales y ya haces lo que quieras, pues con el timer pasa lo mismo, yo cuando lo usé tuve que poner qué quería que pasase cuando cumpliese el tiempo.

El problema vendría en que si haces eso, se repetiría todos los días, así que al crear la alarma debes de controlar también que se ponga en null o en el valor por defecto del atributo time después de que ocurra si quieres que pase solo una vez. Si quieres que pase una vez por semana ya tendrías que meter también una condición de día, en fin, yo te recomiendo, que primero lo hagas a lo básico y luego te compliques poniendo condiciones, así lo hago yo cuando veo que es mucha lata, siempre puedes sacarle punta a un programa aunque pienses que está terminado ;)

¿Qué tienes hecho por ahora? Por favor, explícamelo detalladamente que me entere, no tan breve como has sido, aunque sólo lo tengas planteado dime el planteamiento con pelos y señales.


Modificado después de leer lo del servicio: ¿Para que quieres 500 servicios? O.o No entiendo tu planteamiento, ¿que no ves que con uno se puede? (Aunque yo nunca he hecho servicios, pero al ser un programa en segundo plano pues me supongo como sería)


Título: Re: Dudas con mi agenda!! c#.
Publicado por: Hartigan en 26 Agosto 2010, 20:06 pm
Hola, lo primero gracias por contestar a ambos.

A ver aun no tengo nada, pero el planteamiento es como he dicho. Yo tengo un formulario para crear alarmas y por ejemplo quiero crear una alarma nueva para que cuando llegué a X fecha y X hora salte un mensaje en pantalla por ejemplo.

Otro ejemplo sería que se apagase el ordenador, o que se ejecute un programa. Entoncs como se hace para que salte la señal de alarma cuando llegue a la fecha y hora indicadas??? es decir, al iniciar mi aplicación como hago para que se vayan comprobando todas las alarmas que tengo almacenadas y que si se cumple alguna salte un mensaje o apague el ordenador... etc....  como por ejemplo el programador de tareas de windows.. algo así estoy haciendo, pero si puedo NO meterme en los servicios de windows mejor que mejor porque nunca los he usado...

Saludos. 


Título: Re: Dudas con mi agenda!! c#.
Publicado por: [D4N93R] en 26 Agosto 2010, 20:42 pm
Te digo lo de los servicios porque la aplicacion de tareas de windows corre bajo un servicio windows. Por que sino, dime que pasaría si una tarea debe ser ejecutada y tu aplicación está cerrada..?

Un saludo!


Título: Re: Dudas con mi agenda!! c#.
Publicado por: Hartigan en 26 Agosto 2010, 20:45 pm
Te digo lo de los servicios porque la aplicacion de tareas de windows corre bajo un servicio windows. Por que sino, dime que pasaría si una tarea debe ser ejecutada y tu aplicación está cerrada..?

Un saludo!

umm tienes razón, a la noche me pongo a estudiar los servicios a ver si me entero de algo y ya os comento. xD  Solo espero que no sea demasiado complicado porque me queda poco tiempo para entregar mi proyecto. xD

Gracias D4N93R. xD



Título: Re: Dudas con mi agenda!! c#.
Publicado por: [D4N93R] en 26 Agosto 2010, 20:51 pm
Una sugerencia con respecto al desarrollo de servicios windows:

Primero ,desarrolla toda la aplicación, que funcione bien, y luego lo conviertes en servicio, por lo que la aplicación debe ser una librería.

Segundo, El servicio de windows no se comunica con GUI en ningún momento, por lo que no vas a poder depurar, ni mandar MessageBox, ni abrir formularios. Por lo que depura primero con una aplicacion de prueba (Ver punto 1)

Tercero, tienes que buscar una forma de comunicación entre la interfaz de configuración y el servicio, puede ser un archivo XML, Base de datos, etc.

Saludos y suerte!


Título: Re: Dudas con mi agenda!! c#.
Publicado por: Hartigan en 26 Agosto 2010, 21:12 pm
Una sugerencia con respecto al desarrollo de servicios windows:

Primero ,desarrolla toda la aplicación, que funcione bien, y luego lo conviertes en servicio, por lo que la aplicación debe ser una librería.

Segundo, El servicio de windows no se comunica con GUI en ningún momento, por lo que no vas a poder depurar, ni mandar MessageBox, ni abrir formularios. Por lo que depura primero con una aplicacion de prueba (Ver punto 1)

Tercero, tienes que buscar una forma de comunicación entre la interfaz de configuración y el servicio, puede ser un archivo XML, Base de datos, etc.

Saludos y suerte!

bufff, lo veo muy complicado... no se que hacer...


Título: Re: Dudas con mi agenda!! c#.
Publicado por: [D4N93R] en 26 Agosto 2010, 21:20 pm
Bueno primero termina la aplicación :) y luego si te da tiempo o no haces el servicio..

:P


Título: Re: Dudas con mi agenda!! c#.
Publicado por: Hartigan en 26 Agosto 2010, 21:30 pm
Bueno primero termina la aplicación :) y luego si te da tiempo o no haces el servicio..

:P

jejejeje, ya tio, pero esque algo tengo que hacer con las alarmas, porque el pryecto tengo que entregarlo con alarmas... sino... asíque seguramente lo haga con timers y listo, si luego me sobra tiempo me meto en el tema de los servicios...

Saludos ;)


Título: Re: Dudas con mi agenda!! c#.
Publicado por: KuraraGNU en 26 Agosto 2010, 21:33 pm
Yo creo que con servicio o no sigue teniendo el mismo problema, no sabe cual es el desencadenante que va a rastrear el programa en busca de las alarmas, que me he puesto a pensar y yo tampoco sabría que decirle ¿me explico? tiene el reloj, tiene las alarmas, pero no sabe qué hacer para que se vayan comprobando las alarmas para que salten. ¿Es ese tu problema? Que no te de vergüenza parecer inexperto, que peor soy yo segurísimo XD


Título: Re: Dudas con mi agenda!! c#.
Publicado por: Hartigan en 27 Agosto 2010, 02:06 am
Yo creo que con servicio o no sigue teniendo el mismo problema, no sabe cual es el desencadenante que va a rastrear el programa en busca de las alarmas, que me he puesto a pensar y yo tampoco sabría que decirle ¿me explico? tiene el reloj, tiene las alarmas, pero no sabe qué hacer para que se vayan comprobando las alarmas para que salten. ¿Es ese tu problema? Que no te de vergüenza parecer inexperto, que peor soy yo segurísimo XD

ajajaja, no me da verguenza, si además ya he dicho en alguna ocasión que estoy empezando en esto de .net y es mi primera aplicación asíque soy bastante novato jejeej.

Efectivamente ese es mi problema, que no se que hacer o como hacer para que se vayan comprobando las alarmas con el reloj del ordenador para que salten.... porque como compruebo continuamente la fecha y la hora de cada alarma???, la fecha con una vez valdría, si esa es la fecha ya solo tendría que comprobar hasta que se cumpla la hora pero como lo hago???

Gracias compi ;)


Título: Re: Dudas con mi agenda!! c#.
Publicado por: [D4N93R] en 27 Agosto 2010, 04:18 am
Pues, se me ocurre que tengas una especie de base de datos, puede ser Sql Server, My Sql, un XML, un texto plano, lo que sea, y guardes las alarmas ahí en caso de que cierres la aplicación.

Y cuando esté corriendo, puedes tener un Thread corriendo cada segundo o algo así que verifique las alarmas que tengas con la fecha actual. Creo que eso es todo lo que debes hacer...

Saludos!


Título: Re: Dudas con mi agenda!! c#.
Publicado por: 43H4FH44H45H4CH49H56H45H en 27 Agosto 2010, 11:45 am
Efectivamente ese es mi problema, que no se que hacer o como hacer para que se vayan comprobando las alarmas con el reloj del ordenador para que salten.... porque como compruebo continuamente la fecha y la hora de cada alarma???, la fecha con una vez valdría, si esa es la fecha ya solo tendría que comprobar hasta que se cumpla la hora pero como lo hago???

Solo necesitas un timer:
Código
  1. private void timer1_Tick(object sender, EventArgs e)
  2.        {
  3.            if (DateTime.Now.DayOfYear == 239 && DateTime.Now.Hour == numericUpDown1.Value && DateTime.Now.Minute == numericUpDown2.Value && DateTime.Now.Second == 00) MessageBox.Show("Alarma");          
  4.        }

Los numericUpDown.Value Serian las variables de Hora y minuto, se comprueba el segundo para que el mensaje salga una sola vez.

Para almacenar las variables, ya sea en una BD u otro, recuerda utilizar las variables de entorno por si el usuario no tiene permisos de administrador.


Título: Re: Dudas con mi agenda!! c#.
Publicado por: Hartigan en 6 Septiembre 2010, 17:54 pm
Hola de nuevo. os comento la situación.

He encontrado una web donde mediante una dll de codeproject puedo crear las tareas facilmente, el problema es que lo he probado y no me funciona. Alguien podría probarlo y decirme si le funciona????  Se tarda menos de 5 minutos en hacerlo asíque os lo agradecería mucho, porque he probado de todo y no hay manera.


La web: http://escarbandocodigo.wordpress.com/2009/10/21/crear-tareas-programadas-desde-c/   (Aquí os dice de donde podeis descargar la dll).

mi código:

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using TaskScheduler;
  6. using System.Security.Principal;
  7.  
  8. namespace ConsoleApplication1
  9. {
  10.    class Program
  11.    {
  12.        static void Main(string[] args)
  13.        {
  14.            using (ScheduledTasks Tareas = new ScheduledTasks())
  15.            {
  16.                //Tareas.DeleteTask("Prueb");
  17.                Task tarea = Tareas.CreateTask("Prueba6");
  18.                tarea.ApplicationName = @"C\Users\Litos\Desktop\pepito.xls";
  19.                tarea.Priority = System.Diagnostics.ProcessPriorityClass.High;
  20.                tarea.SetAccountInformation(WindowsIdentity.GetCurrent().Name, "password");
  21.                tarea.Triggers.Add(new DailyTrigger(17, 50));
  22.                tarea.Save();
  23.  
  24.            }
  25.  
  26.  
  27.        }
  28.    }
  29. }

Salu2 y gracias de antemano.


Título: Re: Dudas con mi agenda!! c#.
Publicado por: [D4N93R] en 6 Septiembre 2010, 18:04 pm
Eso te hace todo, cual es la gracia entonces xD


Título: Re: Dudas con mi agenda!! c#.
Publicado por: Hartigan en 6 Septiembre 2010, 18:08 pm
Eso te hace todo, cual es la gracia entonces xD

Jajajaja pues que necesitaba algo así para programar mis alarmas porque no he sido capaz de hacerlo manualmente. De todos modos como digo no he conseguido que me funcione, las tareas no arrancan y no se porqué!!!! xDD




Título: Re: Dudas con mi agenda!! c#.
Publicado por: [D4N93R] en 6 Septiembre 2010, 18:24 pm
Lo mejor es que lo hagas tú a mano, usa una base de datos, y cuando la aplicación arranque cargas todo en memoria, y chequeas cada cierto tiempo comparado con los valores y si ya se ejecutó esa alarma.

Un saludo.


Título: Re: Dudas con mi agenda!! c#.
Publicado por: Hartigan en 7 Septiembre 2010, 01:40 am
Lo mejor es que lo hagas tú a mano, usa una base de datos, y cuando la aplicación arranque cargas todo en memoria, y chequeas cada cierto tiempo comparado con los valores y si ya se ejecutó esa alarma.

Un saludo.

sí, sería lo suyo pero el problema es la falta de tiempo....


Título: Re: Dudas con mi agenda!! c#.
Publicado por: Hartigan en 14 Septiembre 2010, 22:05 pm
Buego sigo sin saber como programar mis alarmas. Os explico.

Esque como hago para que el timer sepa las alarmas que hay en la base de datos y las vaya comprobando??? YO había pensado crear un dataTable en el formulario principal, el cual obtiene los datos de la base de datos y el timer solo los tiene que usar...


Por otra parte. Supongamos que el timer está comprobando alarmas, y de repente añado una nueva alarma, como hago para que el timer se detenga y lea ahora los nuevos datos de la base de datos???

gracias de antemano


Título: Re: Dudas con mi agenda!! c#.
Publicado por: raul338 en 14 Septiembre 2010, 22:25 pm
Yo hice un timer para apagar la pc a cierta hora, asi que lo que hago es esto

Creo un TimeSpan con la diferencia de horas desde "ahora" hasta la hora destinada de la tarea (apagado)
Con el timer cada 1 segundo le resto... precisamente 1 segundo
En el timer, si el timeSpan llega a 0 (y/o la hora de la tarea es la actual) simplemente hacer la tarea :P

O sea ,  puedes usar en el timer tantos if o timespan como tareas... aunque dudo que tengas muuchas tareas al mismo tiempo (como para ralentizar el timer) asi que es efectivo :P


Título: Re: Dudas con mi agenda!! c#.
Publicado por: Hartigan en 14 Septiembre 2010, 22:49 pm
Yo hice un timer para apagar la pc a cierta hora, asi que lo que hago es esto

Creo un TimeSpan con la diferencia de horas desde "ahora" hasta la hora destinada de la tarea (apagado)
Con el timer cada 1 segundo le resto... precisamente 1 segundo
En el timer, si el timeSpan llega a 0 (y/o la hora de la tarea es la actual) simplemente hacer la tarea :P

O sea ,  puedes usar en el timer tantos if o timespan como tareas... aunque dudo que tengas muuchas tareas al mismo tiempo (como para ralentizar el timer) asi que es efectivo :P

gracias de momento he probado con la cadena del compañero 43H4FH44H45H4CH49H56H45H a ver si me funcionar, y lo he hehco como dije. Acabo de programar un aviso a ver si me sale. Ahora os digo

EDITO: no me ha saltado el menasje ... voy a revisar. he puesto esto:

Primero leo los datos de la base de datos en un DataTable, y a continuación hago que el ticker se pare y vuelva a empezar con la función enabled. Es decir:

Código
  1.  
  2. private void Funcion_Reprogramar_Timer(bool valor)
  3.        {
  4.  
  5.            if (valor == true)
  6.            {
  7.                GestorAvisos ga = new GestorAvisos();
  8.                DataTable tabla = ga.Obtener_Lista_Avisos(factoriaDAO, login);
  9.                if (tabla != null)
  10.                {                    
  11.                    this.timerAlarmas.Enabled = false;
  12.                    Tabla = tabla;
  13.                    this.timerAlarmas.Enabled = true;
  14.                }
  15.                else
  16.                {
  17.                    this.timerAlarmas.Enabled = false;
  18.                }
  19.            }
  20.            else
  21.            {
  22.                this.timerAlarmas.Enabled = false;
  23.            }
  24.        }
  25.  
  26.       private void timerAlarmas_Tick(object sender, EventArgs e)
  27.        {
  28.            int i = 0;
  29.            int max = Tabla.Rows.Count;
  30.            int anno;
  31.            int hora, minutos, segundos;
  32.            int dia, mes, año;
  33.  
  34.            for (i = 0; i < max; i++)
  35.            {
  36.                dia = Convert.ToInt32(Tabla.Rows[i][4].ToString().Substring(0, 2));
  37.                mes = Convert.ToInt32(Tabla.Rows[i][4].ToString().Substring(3, 2));
  38.                anno = Convert.ToInt32(Tabla.Rows[i][4].ToString().Substring(6, 4));
  39.                hora = Convert.ToInt32(Tabla.Rows[i][5].ToString().Substring(0, 2));
  40.                minutos = Convert.ToInt32(Tabla.Rows[i][5].ToString().Substring(3, 2));
  41.                segundos = Convert.ToInt32(Tabla.Rows[i][5].ToString().Substring(6, 2));
  42.                if ((DateTime.Now.Year == anno) &&(DateTime.Now.Month == mes) && (DateTime.Now.Day == dia) && (DateTime.Now.Hour == hora) && (DateTime.Now.Minute == minutos) &&
  43.                    (DateTime.Now.Second == segundos))
  44.                {
  45.                    this.timerAlarmas.Enabled = false;
  46.                    MessageBox.Show(Tabla.Rows[i][2].ToString(), "ALARMA", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
  47.                }
  48.            }
  49.        }
  50.  

En principi los datos los coge bien. Como detalle decir que en la bdd almaceno la fecha y la hora como strings porque me es más fácil manejarlas.

A ver si me ayudais.

EDITO:

Vale Solucionado. Ya me funcionar. (modifico el código)

Por cierto tengo una duda, es mejor por el timer en Enabled = false y luego volver a ponerlo en Enabled = true o usar stop y start??? lo digo por el tema de reiniciarlo, ya que me comentaron que el timer tiene un límite aunque es bastante grande, pero sino lo reinicio nunca pues...


Título: Re: Dudas con mi agenda!! c#.
Publicado por: raul338 en 14 Septiembre 2010, 23:40 pm
Justamente la comparacion que estoy haciendo es muy similar

Pues la verdad nunca uso los timer comunes, simpre los creo por codigo de la clase System.Timers y siempre hago Timer.Start y Timer.Stop


Título: Re: Dudas con mi agenda!! c#.
Publicado por: Hartigan en 15 Septiembre 2010, 00:49 am
Justamente la comparacion que estoy haciendo es muy similar

Pues la verdad nunca uso los timer comunes, simpre los creo por codigo de la clase System.Timers y siempre hago Timer.Start y Timer.Stop

mmm bueno pues ya veré alomerjo lo cambio y lo creo por código en lugar de usar el control.


Título: Re: Dudas con mi agenda!! c#.
Publicado por: Hartigan en 15 Septiembre 2010, 04:02 am
Bueno chic@s, pues deciros que ya tengo mis alarmas creadas y funcionando perfectamente. jejejeje.

Gracias a todos por la ayuda  ;-)


Título: Re: Dudas con mi agenda!! c#.
Publicado por: Hartigan en 17 Septiembre 2010, 22:21 pm
Tengo una nueva duda y lo pregunto aquí para no crear tropecientos hilos. xDD

El caso es que tengo un string con el siguiente formato de fecha "dd/MM/yyyy" y quiero convertirlo a string con el formato "yyyy/MM/dd".

Como puedo hacerlo???

Salu2.l


Título: Re: Dudas con mi agenda!! c#.
Publicado por: [D4N93R] en 18 Septiembre 2010, 00:00 am
Este es el mejor link sobre ese tema! : http://msdn.microsoft.com/en-us/library/az4se3k1.aspx


Título: Re: Dudas con mi agenda!! c#.
Publicado por: Hartigan en 18 Septiembre 2010, 01:36 am
Gracias ya lo conseguí aunque tampoco era así como lo quería, sino "yyyyMMdd" sin las barras, para que me lo leyera bien el vCard que no lo estaba haciendo bien, pero ahora sí. xD