Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: ronald hisp en 24 Abril 2009, 18:51 pm



Título: Ayuda con Timer C#..
Publicado por: ronald hisp en 24 Abril 2009, 18:51 pm
Este es parte de mi codigo;
- De un login que al tercer intento se bloquee y por un tiempo y si en la cuarta falla se cierra el programa.


using System.Timers;  //para usar el timer

private void btnAceptar_Click(object sender, EventArgs e)  //boton aceptar
        {
            if (i == 3)
            {   MessageBox.Show("El sistema se bloqueo \n espere 10 seg. para su ultimo intento");
                txtPass.Visible = false; // aqui oculto los textbox
                txtUser.Visible = false; // aqui oculto los textbox
                System.Timers.Timer tm = new System.Timers.Timer();
             
                tm.Interval = 10000; //aqui que espere 10 segundos
                txtPass.Visible = true; //aqui muestra los textbox
                txtUser.Visible = true;
               
               //mi error esta en el timer esa es mi gran duda...
              // que bloquee por 10 seg los textbox..
           
            frmOpcionesC frm = new frmOpcionesC();
            string aux = txtUser.Text;
            if (txtUser.Text == "admin" && txtPass.Text == "admin")
            {
                i =i-1;
                MessageBox.Show("Bienvenido " + aux);
                frm.Show();
                this.Close();
            }
            else
            {
                MessageBox.Show("El usuario o password no existen verifique");
                txtUser.Text = "";
                txtPass.Text = "";
                txtUser.Focus();
            }
            if (i == 4)
            {
                Application.ExitThread();
                MessageBox.Show("4er Intento Cerrando...");
            }
            i++;
        }

//antemano gracias...x sus ayudas..
//


Título: Re: Ayuda con Timer C#..
Publicado por: Novlucker en 24 Abril 2009, 19:12 pm
Y que tal un simple sleep  :huh:

Código
  1. System.Threading.Thread.Sleep(10000)

Saludos


Título: Re: Ayuda con Timer C#..
Publicado por: ronald hisp en 24 Abril 2009, 19:19 pm
ahorita lo voy aprobar..
System.Threading.Thread.Sleep(1000);

----------------------------------
si funciono:
gracias... por sacarme de esa duda..
se agradece...
 ;D :D ;D :D

----------------------------------
 evento tick:
gracias ... veo que ay varias formas para hacer esto .....gracias.
 :D ;D
-------------------------------
ok. gracias por la aclaracion...
-------------------------------



Título: Re: Ayuda con Timer C#..
Publicado por: KJD en 24 Abril 2009, 19:29 pm
El tiemer tiene un evento tick que se ejecuta cuando el intervalo ya paso, ahi puedes habilitar de nuevo los textbox.


Título: Re: Ayuda con Timer C#..
Publicado por: Novlucker en 24 Abril 2009, 19:35 pm
Como dice KJD, con el timer también es posible, pero deberías de estar iniciandolo, ejecutando lo que quieres y parandolo, creo que para intervalos tan cortos el sleep es mejor  :D

Saludos


Título: Re: Ayuda con Timer C#..
Publicado por: KJD en 25 Abril 2009, 00:52 am
Yo usaria el timer ya que con el sleep tuve problemas de cuelgue, si queira mover la pantalla o minimizarla la aplicacion se me colgaba.  :-\


Título: Re: Ayuda con Timer C#..
Publicado por: MANULOMM en 26 Abril 2009, 00:38 am
Obvio que con el Sleep asi nada mas se va a colgar la interfaz pues el sleep lo que hace es parar el hilo principal de la aplicacion, el timer inicia un segundo hilo en el procesador. Realmente no es un problema es solo cuestion de saber cuando usar los recursos apropiados.

Atentamente,

Juan Manuel Lombana
Medellín - Colombia


Título: Re: Ayuda con Timer C#..
Publicado por: 410n5o en 28 Abril 2009, 06:47 am
Buenas a todos,
Disculpen mi interrupción en este post pero ya que estan en el tema que me preocupa.
Estoy haciendo una aplicación que obtiene caracteristicas de una máquina como uso del cpu, uso de ram, porcentaje libre de discos duros, etc. Ya tengo la libreria hecha para obtener eso, hasta ahi bien, pero lo que pasa es que esa aplicacion llama a un servicio web que guarda esos datos en un archivo en otra máquina claro, pero necesito creo que es un Timer para actualizar esos datos una vez por minuto, o sea que tendria que obtener los datos de la máquina y luego llamar al servicio web para que guarde los datos, eso cada minuto mientras está la aplicacion ejecutándose. He leido sobre Timer pero no sé como utilizarlo bien, cómo deberia hacer para que el método se llame cada minuto?
Les agradeceria mucho si me ayudan


Título: Re: Ayuda con Timer C#..
Publicado por: KJD en 28 Abril 2009, 12:55 pm
Me sorprende que hayas creado una libreria que haga todo eso y que no sepas usar un timer  :xD pero bueno a todos nos paso. Fijate aca http://msdn.microsoft.com/es-ar/library/system.timers.timer.aspx


Título: Re: Ayuda con Timer C#..
Publicado por: 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


Título: Re: Ayuda con Timer C#..
Publicado por: geek74 en 9 Julio 2009, 20:39 pm
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


Título: Re: Ayuda con Timer C#..
Publicado por: raul338 en 11 Julio 2009, 18:00 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
  1. Form2 miForm = new Form2();
  2. 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
  1. // Creamos el delegado
  2. delegate void dlgCambiarDatos();
  3.  
  4. // .......................
  5. // Evento Tick
  6. private void Tick(object sender, ElapsedEventArgs e)
  7. {
  8.      CambiarDatos();
  9. }
  10. // .......................
  11.  
  12. void CambiarDatos()
  13. {
  14.    if (this.InvokeRequired)  // Preguntamos al form (this) si estamos accediendo desde otro hilo
  15.    {
  16.        // Instanciamos el delegado y lo invocamos desde el mismo hilo del form
  17.        dlgCambiarDatos delegado = new dlgCambiarDatos(CambiarDatos);
  18.        this.Invoke(delegado);
  19.    }
  20.    else
  21.    {
  22.        // Estamos en el mismo hilo
  23.        // Aqui se cambian los datos comunmente sin errores :P
  24.    }
  25. }
  26.  


Espero que a alguien le sirva!!!!


Título: Re: Ayuda con Timer C#..
Publicado por: 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


Título: Re: Ayuda con Timer C#..
Publicado por: raul338 en 15 Julio 2009, 18:30 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  :-\