sábado, 24 de marzo de 2012

Timer para efectos visuales en C#

Al querer hacer simulaciones simples en Visual C# nos encontramos con la necesidad de hacer un pequeño "retraso" para que cierto efecto visual sea perceptible para el usuario (en el caso que despues de cierto evento este vuelva a la condición anterior en que se encontraba).

Por ejemplo tener en un listbox N número de elementos en el y queremos que se seleccione el primer elemento(para resaltarlo) y que luego vuelva a su condición original cuando no estaba seleccionado para que siga con el mismo proceso en el elemento siguiente.



Para controlar el tiempo de un estado a otro debemos usar el método Sleep() de la clase Thread,
para ello usamos la librería System.Threading; en la cabecera del código y justo entre el cambio de estado usamos el método Thread.Sleep(ms); donde ms es el tiempo de espera en milisegundos.

Pero ahora bien, cuando corremos el código notamos que la aplicacion se pausa el tiempo deseado pero no vemos el efecto visual que esperabamos en el Form, sino que al final del tiempo pareciera como si todo se hubiera ejecutado de una sola vez.

Esto se soluciona agregando Application.DoEvents(); antes de la línea Thread.Sleep(ms); y veremos como el efecto si se aprecia correctamente. La única desventaja de este método es que mientras este corriendo el tiempo especificado en ms no podremos usar ningún control del Form ni mover la ventana y si cerramos la ventana mientras esta ejecutando el sleep quedara un proceso trabajando en segundo plano.

Ejemplo:
textbox.BackColor=Color.Aqua;
Application.DoEvents();
Thread.Sleep(1000);
textbox.BackColor=Color.White;

En el anterior ejemplo cambiamos el color de fondo de un TextBox de blanco(por defecto) a Aqua durante 1 segundo y luego volvio al color blanco por defecto. Sin la linea Application.DoEvents() lo único que hubiera pasado es que se congela la ventana por 1 segundo y no se percibe el cambio de color.

Tambien AQUI puedes ver un ejemplo del retardo al recorrer los textbox.


Fuente: http://msdn.microsoft.com/es-es/library/system.windows.forms.application.doevents.aspx

1 comentario: