none
control del timer en c# RRS feed

  • Pregunta

  • Buenas tardes recuro a ustedes por barias inquietudes y les pido ayuda, estoy en mi Proyecto de tesis y no se manejar mucho el C#.

    Tengo un formulario en el que puedo visualizar todas las reservaciones que he hecho en mi sistema, lo puedo ver dando un clic a un botos con el nombre de las habitaciones y veo el rodas sus informaciones y el tiempo restante y todo eso está súper.

             try

                {

                    int diasretantes=0;

                   diasretantes = Convert.ToInt32(lbldiasrestante.Text);

                    if (diasretantes >= 0)

                    { DateTime hoy = DateTime.Now;

                        string tiempo = txthora_salida.Text;

                        ahora = Convert.ToDateTime(txtfecha_salida.Text);

                        fecha = tiempo.Split(':');

                        final = new DateTime(ahora.Year, ahora.Month, ahora.Day,

                            Convert.ToInt32(fecha[0]), Convert.ToInt32(fecha[1]), Convert.ToInt32(fecha[2]));

                        TimeSpan diferencia = new TimeSpan();

                        diferencia = final - hoy;

                        lbltiemporestante.Text = diferencia.Hours + ":" + diferencia.Minutes + ":" + (diferencia.Seconds + 1);

                    }

                    else

                    {

                        if (diasretantes < 0 || Convert.ToInt32(lbltiemporestante.Text) < 0)

                        {

                            tiemporestante.Enabled = false;

                            MessageBox.Show("Finalizo el tiempo.");

                        }

                    }

                }

    El código anterior me funciona perfectamente, lo que pido es fuera de ese código.

    Lo que quiero ahora es hacer que cuando yo haga una reserva, desde que si inicie la reserva empiece a correr el tiempo de esa habitación y cuando el lapso de tiempo se termine, que se cumpla el día y la hora de salida me indique un mensaje de que el tiempo de esa reserva ya se cumplió. Sin importar en el formulario que se encuentre el usuario trabajando, que haga lo mismo con todas las reserva que se hagan, que controle lo diferente tiempo de cada reservación y si una reserva finaliza el sistema me notifica y que las demás siga corriendo el tiempo igual hasta que cada una culmine…

    No sé si me di a entender, gracias de antemano.

    jueves, 5 de septiembre de 2019 20:04

Respuestas

  • Hola Waldy

    Para que un timer comience a generar eventos Tick hay que habilitarlo

    timer1.Start();  // o timer1.Enabled = true;

    Antes de eso, seguramente estableciste su propiedad Interval, que es la cantidad de milisegundos que transcurren entre cada evento Tick.

    En el método controlador del Evento Tick se coloca el código que se ejecuta cada Interval milisegundos.

    Si se debe ejecutar ese código sólo una vez, en ese mismo método podes colocar el código que deshabilita el timer

    timer1.Stop();  // o timer1.Enabled = false;

    Saludos

    Pablo

    viernes, 6 de septiembre de 2019 1:03
  • hola

    Podrias implementar esto que describes en el form principal quizas usando el timer que implementa thread (hilos) para que ejecute en otro proceso y no moleste a la aplicaicon principal mientras la utilizas

    O podrias crear una apalicaicon separada que se minimice en el Try Icon (existe para esto el control NotifyIcon), o sea un icono al lado del relojo de la barra de windows que lance un popup cuando hay un alerta

    mas ala de cual sea el caso vas a tener que tomar las reservas de la db y validar las fechas, restando la actual con la del inicio y viendo si se cumplio el plazo

     Usando Threads en C#.NET: Timers

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 6 de septiembre de 2019 12:48
  • Hola Waldy

    Hola Leandro

    Waldy:

    Cuando se cumple el tiempo programado para cada unidad (reserva), se ejecuta el código del método controlador del Evento Tick, o sea lo que necesitas que se haga cumplido el tiempo, debes escribirlo allí. Yo lo que puse allí es un Form que avisa el nro de unidad, la hora inicial de la reserva, y la hora actual que es cuando se cumple el tiempo.

    Fijate que hay una clase que creas objetos de la misma al hacer una reserva, y cada objeto (que contiene los datos de la reserva, que podes agregarle más datos si fuese necesario) te avisa cuando vence el plazo. (y ahí mismo podes eliminar ese objeto con Dispose() o hacer otras cosas antes). Cada objeto tiene su propio Timer.

    Lo que hace 

    FormPpal owner = (FormPpal)this.Owner;

    es crear una referencia al form padre (owner), para poder acceder a sus datos o métodos

    Leandro:

    Me parece que el MessageBox.Show() funciona como un diálogo modal, o sea paraliza la interfaz hasta que le respondes. Por eso lo que hice fue un pequeño form que avisa "tiempo cumplido" y los muestra con su método Show() (NO ShowDialog), lo que lo hace no modal, con lo que pueden aparecer muchos carteles al mismo tiempo y no paralizan la aplicación.

    Saludos

    Pablo

    lunes, 9 de septiembre de 2019 22:40
  • como yo aria para que en el código que reconozca la hora y fecha de salida de una reserva y cuando se finalice y sea igual a la hora actual me detenga el tiempo y me mande el mensaje de que finalizo ese reserva 
    viernes, 6 de septiembre de 2019 19:23
  • ok, si ese ejemplo esta perfecto es justo lo que ando buscando, que me muestre el mensaje no importa en que formulario este. 

    una pregunta el código que me reconoce el tiempo de la reserva en cualquier formulario e este.

     FormPpal owner = (FormPpal)this.Owner;

    lunes, 9 de septiembre de 2019 19:07

Todas las respuestas

  • Hola Waldy

    Para que un timer comience a generar eventos Tick hay que habilitarlo

    timer1.Start();  // o timer1.Enabled = true;

    Antes de eso, seguramente estableciste su propiedad Interval, que es la cantidad de milisegundos que transcurren entre cada evento Tick.

    En el método controlador del Evento Tick se coloca el código que se ejecuta cada Interval milisegundos.

    Si se debe ejecutar ese código sólo una vez, en ese mismo método podes colocar el código que deshabilita el timer

    timer1.Stop();  // o timer1.Enabled = false;

    Saludos

    Pablo

    viernes, 6 de septiembre de 2019 1:03
  • hola

    Podrias implementar esto que describes en el form principal quizas usando el timer que implementa thread (hilos) para que ejecute en otro proceso y no moleste a la aplicaicon principal mientras la utilizas

    O podrias crear una apalicaicon separada que se minimice en el Try Icon (existe para esto el control NotifyIcon), o sea un icono al lado del relojo de la barra de windows que lance un popup cuando hay un alerta

    mas ala de cual sea el caso vas a tener que tomar las reservas de la db y validar las fechas, restando la actual con la del inicio y viendo si se cumplio el plazo

     Usando Threads en C#.NET: Timers

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 6 de septiembre de 2019 12:48
  • si se como activar el timer para que se empiece a ejecutar, pero el problema esta en que no tengo el cogido que me maneje  el tiempo de cada una de las conservaciones y me indique cuando estén finalizando cada una de ellas y desde que se registren nuevas reservas la valla manejando individual de las demás 
    viernes, 6 de septiembre de 2019 19:08
  • como yo aria para que en el código que reconozca la hora y fecha de salida de una reserva y cuando se finalice y sea igual a la hora actual me detenga el tiempo y me mande el mensaje de que finalizo ese reserva 
    viernes, 6 de septiembre de 2019 19:23
  • Hola Waldy

    Fijate en este ejemplo básico 

    https://www.dropbox.com/s/917clxdchg98byv/WindowsFormsApplication1.rar?dl=0

    Luego tendrías que adecuarlo a lo que necesita tu aplicación concretamente

    Cualquier duda avisa

    Saludos

    Pablo

    sábado, 7 de septiembre de 2019 1:00
  • ok, si ese ejemplo esta perfecto es justo lo que ando buscando, que me muestre el mensaje no importa en que formulario este. 

    una pregunta el código que me reconoce el tiempo de la reserva en cualquier formulario e este.

     FormPpal owner = (FormPpal)this.Owner;

    lunes, 9 de septiembre de 2019 19:07
  • hola

    >>una pregunta el código que me reconoce el tiempo de la reserva en cualquier formulario e este.

    Pero el timer si esta ejecutando sobre un form principal podrias lanzar un mensaje usando el MessageBox.Show() por sobre todos los demas que tengas abiertos

    No veo que tiene que ver el this.Owner que se aplica para comunicar formularios, si quieres pasarle un dato de un form a otro puedes aplicar esta tecnica

    Comunicar Formularios

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 9 de septiembre de 2019 20:03
  • Hola Waldy

    Hola Leandro

    Waldy:

    Cuando se cumple el tiempo programado para cada unidad (reserva), se ejecuta el código del método controlador del Evento Tick, o sea lo que necesitas que se haga cumplido el tiempo, debes escribirlo allí. Yo lo que puse allí es un Form que avisa el nro de unidad, la hora inicial de la reserva, y la hora actual que es cuando se cumple el tiempo.

    Fijate que hay una clase que creas objetos de la misma al hacer una reserva, y cada objeto (que contiene los datos de la reserva, que podes agregarle más datos si fuese necesario) te avisa cuando vence el plazo. (y ahí mismo podes eliminar ese objeto con Dispose() o hacer otras cosas antes). Cada objeto tiene su propio Timer.

    Lo que hace 

    FormPpal owner = (FormPpal)this.Owner;

    es crear una referencia al form padre (owner), para poder acceder a sus datos o métodos

    Leandro:

    Me parece que el MessageBox.Show() funciona como un diálogo modal, o sea paraliza la interfaz hasta que le respondes. Por eso lo que hice fue un pequeño form que avisa "tiempo cumplido" y los muestra con su método Show() (NO ShowDialog), lo que lo hace no modal, con lo que pueden aparecer muchos carteles al mismo tiempo y no paralizan la aplicación.

    Saludos

    Pablo

    lunes, 9 de septiembre de 2019 22:40
  • perfecto me toma la reservas desde que las registro, pero me gustaría que a la lista

     public List<clasereservaDal> reservas;
      public menu()
            {
                InitializeComponent();
                reservas = new List<clasereservaDal>();
            }

    se agregara todas las reservas que están hechas en el sistema, sin importar que el sistema esta en ejecución o no(  con esto me refiero que si ejecutamos en programa las reservas que están ya registrada, las lista se actualice automáticamente y me indique cuando se cumpla el tiempo de las mismas).

    que si tengo 10 reserva hechas que terminen en un dia o dos dia, si el programa se finaliza y luego se ejecuta nuevamente la lista se actualice con los tiempos restantes 

    viernes, 13 de septiembre de 2019 19:14
  • Usas una base de datos en tu aplicación? O sea los datos de las reservas los vas a guardar en una bd o en un archivo de disco? Para recuperarlos al reiniciar la aplicación ...

    viernes, 13 de septiembre de 2019 20:14
  • en una BD SQL server 

    lo estoy tratando de hacer asi

     using (SqlConnection conexion = dbcomun.ObtnerCOnexion())

                {
                    SqlDataAdapter da = new SqlDataAdapter("select * from reserva order by Id ", conexion);

                    DataTable dt = new DataTable();
                    da.Fill(dt);
                    string est_res;

                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        est_res = Convert.ToString(dt.Rows[i][1]);

                        if (est_res == "Activa")
                        {
                            reservas.Add(clasereservaDal);
                        }

    • Editado waldy suarez viernes, 13 de septiembre de 2019 21:39
    viernes, 13 de septiembre de 2019 20:57
  • hola Waldy

    https://www.dropbox.com/s/917clxdchg98byv/WindowsFormsApplication1.rar?dl=0

    Fijate en este ejemplo, continuación del anterior ... creo que la parte de BD está un poco más sencilla

    Saludos

    Pablo

    viernes, 20 de septiembre de 2019 22:14