lunes, 28 de enero de 2008

Visual .NET - Auroejecutar procesos al abrir una ventana

Hoy toca hablar un poco de Visual .NET, y tocaré el tema de como hacer que se autoejecuten procesos al abrir una ventana de nuestro programa. Para poder ejecutar codigo al abrir una ventana es tan simple como hacer doble click sobre cualquier punto vacio de ésta en el modo de edición. Entonces se nos generará el codigo necesario para poder ejecutar código al arrancar la ventana, como si fuera cualquier otro objeto.


Hasta ahí todo muy fácil y muy bonito. Pero esto puede ocasionar problemas. Imaginemos por ejemplo que al arrancar queremos que nuestro programa lea información de un sitio web y la asigne a una variable, y en la linea siguiente intentamos usar dicha variable. Pues el programa casi seguro que fallará. Y porqué? Pues porque no le habrá dado tiempo a leer la información de la web, porque esto tarda unas decimas de segundo o incluso varios segundos dependiendo del estado de la conexión, y por lo tanto la variable estará aun vacía cuando lleguemos a la linea de codigo siguiente.

Hay varias formas de solucionar el problema, pero todas pasan por ganar tiempo para que el programa tenga ocasión de leer la información antes de llegar a la siguiente línea.

- Una forma un tanto sucia de hacerlo es introducir un bucle vacio entre las 2 instrucciones para entretener al sistema unas decimas de segundo, que se repita unos miles de veces. Esto funciona pero en terminos de optimización es bastante desastroso.

- Otra forma es dejar la segunda linea de codigo para otro momento, ya sea metiendola al final del "load" si es posible y si hay más instrucciones por enmedio o haciendo que se ejecute en otro lugar, como por ejemplo en un botón accionado por el ususario. Esto tampoco es la forma más elegante de solucionar el problema y suele ser muy mala idea cargar al usuario con nuestros problemas.

- La mejor forma de hacerlo es usando un timer. Ahora mismo se me ocurren 2 formas de hacerlo. La primera aparece en la imagen de antes, donde simplemente se ejecuta el timer dentro del load y dentro del timer ponemos el codigo que se tiene que ejecutar con retraso. La otra es parecida a usar un bucle, solo que en vez de darle un numero fijo de ciclos, hacemos que compruebe en cada ciclo si el timer ha alcanzado un determinado valor (por ejemplo que el timer valga 1000, o sea, 1 segundo).

Ahora el programa debería funcionar, a menos que tenga más errores, pero eso ya es trabajo de cada uno. Espero que os haya sido de ayuda.