Ayuda con Timer C#..

Iniciado por ronald hisp, 24 Abril 2009, 18:51 PM

0 Miembros y 1 Visitante están viendo este tema.

geek74

#10
la solucion es mas sencilla que la que plantean con el Sleep, basta con que uses una variable de tipo intero dentro de la clase de tu form y uses el control Timer

private void timer1_Tick(object sender, EventArgs e)
       {
           int s = int.Parse(String.Format("{0:ss}", DateTime.Now));
           cajatexto.Text =s.ToString();
           if (s == 59)
           {
               contador += (s / 59);
               this.Text = contador.ToString();
           }
           
           
       }
con eso llevas un conteo de los minutos que estan pasando en tu form abierta.

aun existe otra forma mas sencilla

en el control timer.interval=60000 que son un minuto y en el form_load lo activas,


ya si lo que quieres mucho mejor

Crea una clase llamada Cronómetro, luego los métodos, iniciar, pausar y detener.
Crea una propiedad llamada Tiempo de tipo Timer
Crea una propiedad publica llamada Resultado de double
Crea una metodo para sobre escribir el método ToString(); y mostrar el resultado que así deseas:

En tu formulario entonces creas los botones y sus eventos respectivos y generas una instancia de tu clase cronómetro y haces los llamados en cada evento, así:


using System;
using System.Globalization;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
   public class Cronometro
   {
       private Timer Tiempo { get; set; }
       public Double Result { get; set; }

       public Cronometro()
       {
           Tiempo.Tick += new EventHandler(Tiempo_Tick);
           Tiempo.Interval = 100;
       }

       void Tiempo_Tick(object sender, EventArgs e)
       {
           Result++;
           //cada tick representa 100 milisegundos
       }

       public void Start()
       {
           Tiempo.Start();
       }

       public void Pause()
       {
           //
       }

       public void Stop()
       {
           Tiempo.Stop();
       }

       public override string ToString()
       {
           return string.Format(
               CultureInfo.CurrentCulture,
               "{0} ms",
               Result);

       }
   }
}
y luego:

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
   public partial class Form1 : Form
   {
       public Cronometro Cronometro { get; set; }

       public Form1()
       {
           InitializeComponent();
           Cronometro = new Cronometro();
       }

       private void btnStart_Click(object sender, EventArgs e)
       {
           Cronometro.Start();
       }

       private void btnStop_Click(object sender, EventArgs e)
       {
           Cronometro.Stop();
       }
   }
}
Para mostrar el resultado utiliza el método Cronometro.ToString();

sin embargo hay otra opcion que creo que es mejor bueno a mi me a funcionado bien.
un timer y una variable private de tipo DateTime y le asignas un valor de DateTime.Now  dentro de la clase de tu Form

ahora en el evento del timer

private void timer1_Tick(object sender, EventArgs e)
       {
           
           DateTime t_final = DateTime.Now;
           TimeSpan tiempo = t_final - t_inicio;
           int seg_total = (int)(tiempo.TotalSeconds);
           int segundos = tiempo.Seconds;
           textEdit1.Text = seg_total.ToString();
           if ((seg_total % 60) == 1)
           {
              //conteo de minutos transcurridos
               minutos++;
               this.Text = minutos.ToString() + " : Minutos";
               
               
           }
       }



Saludos

raul338

Cita de: 410n5o en 28 Abril 2009, 19:13 PM
Jaja la verdad no fue tan difícil hacer la libreria. Gracias por la ayuda pero mi problema principal es que dentro de un evento "private static void OnTimedEvent(object source, ElapsedEventArgs e)" no puedo llamar a un método, lo que necesito es que el método para obtener componentes se llame cada minuto, habrá alguna otra manera de hacerlo?
Gracias

Eso me suena a un problema que tuve hace un tiempo con una aplicacion con 3 timers por separado. Me tiraba errores porque no podia acceder a otros Threads (hilos del proceso). La solucion? Crear UN solo metodo que haga lo que tenga que hacer, pero no llamarlo directamente, sino invocandolo a travez de un delegado.

Ejemplo:

Todos saben que para cambiar un label de otro Formulario se hace asi:
Código (csharp) [Seleccionar]
Form2 miForm = new Form2();
miForm.Label2.Text = "Texto cambiado";


Pero si la segunda linea de ese codigo la hacias en el evento Tick de un Timer totalmente creado por codigo, tira el error que mencione antes. Y aqui la solucion
Código (csharp) [Seleccionar]

// Creamos el delegado
delegate void dlgCambiarDatos();

// .......................
// Evento Tick
private void Tick(object sender, ElapsedEventArgs e)
{
      CambiarDatos();
}
// .......................

void CambiarDatos()
{
    if (this.InvokeRequired)  // Preguntamos al form (this) si estamos accediendo desde otro hilo
    {
        // Instanciamos el delegado y lo invocamos desde el mismo hilo del form
        dlgCambiarDatos delegado = new dlgCambiarDatos(CambiarDatos);
        this.Invoke(delegado);
    }
    else
    {
        // Estamos en el mismo hilo
        // Aqui se cambian los datos comunmente sin errores :P
    }
}



Espero que a alguien le sirva!!!!

MANULOMM

de hecho el problema del evento private static void OnTimedEvent(object source, ElapsedEventArgs e) esta en que es estatico, no puede llamar metodos de instacias que esten fuera del metodo pues este no tiene acceso a ese contexto, implicaria una reestructuracion de la libreria.

Atentamente,

Juan Manuel Lombana
Medellín - Colombia


raul338

Cita de: MANULOMM en 14 Julio 2009, 21:19 PM
de hecho el problema del evento private static void OnTimedEvent(object source, ElapsedEventArgs e) esta en que es estatico, no puede llamar metodos de instacias que esten fuera del metodo pues este no tiene acceso a ese contexto, implicaria una reestructuracion de la libreria.

Atentamente,

Juan Manuel Lombana
Medellín - Colombia

Pero porque es estatico?? Que yo sepa no deberia serlo, no le veo un uso a instanciar un timer desde un metodo estatico  :-\