Portal    Foro    Buscar    FAQ    Registrarse    Conectarse

El Bucle (o Lazo) De Eventos (Event Loop)

El Bucle (o Lazo) De Eventos (Event Loop)
Artículo
Responder citando    Descargar mensaje 
Mensaje El Bucle (o Lazo) De Eventos (Event Loop) 
 
Un programa sin interfaz gráfica tiene un principio, un proceso y un final. Como mucho podremos ir haciendo paraditas y preguntando cosas al usuario cuyas respuestas derivarán hacia un lado u otro el flujo del programa. Eso es -aunque la expresión se use también en otros contextos- "programación lineal" o "programación orientada a procesos".
Un programa con interfaz gráfica tiene un principio, y un final, pero no tiene entre medias un proceso definido. Depende "de lo que ocurra". Es decir, puede ocurrir que el usuario pulse tal botón, o no, o pulse primero el botón A y luego el B o al revés, etc. etc. Es decir no sabemos de antemano qué partes de nuestro código ni en qué orden va a ser ejecutada. Hay que esperar a ver lo que eventualmente el usuario decide. Es "programación orientada a Eventos".

Cuando hacemos un programa con interfaz gráfica en gambas entramos, lo sepamos o no, en la segunda forma de programar. El funcionamiento es el siguiente:
Cuando un programa gambas ha terminado de ejecutar su función de inicio Main() -normalmente la apertura del formulario fMain(), entra en un estado de espera llamdo "Bucle -o lazo- de Eventos", Event Loop en inglés.
En éste estado el programa espera que se levante (RAISE) un evento y lo procesa. Permanecerá dentro de éste estado mientras haya
    -Un proceso (Process) corriendo, o
    -Un Timer habilitado o,
    -Un File siendo vigilado o,
    -Una ventana abierta.
Nótese que el bucle de eventos es independiente de la existencia o no de la ventana principal. Si cerramos dicha ventana pero tenemos un proceso o un watch abiertos, nuestro programa no finalizará hasta que ejecutemos un QUIT.
El bucle de eventos se lanza cuando hay algún evento que así lo requiera y procesa todas las cuestiones que tiene pendientes.
Tened presente que el cambio de alguna propiedad, por ejemplo el tamaño o el contenido de un control, no siempre genera el efecto deseado por cuanto no dispara el bucle de Eventos. Un ejemplo:
Imaginad que tenemos formulario con un textarea y un botón.

Imaginad que en ese textarea queremos ir viendo los pasos de un bucle en el que copiamos ficheros o en el que procesamos registros o lo que sea. En este caso pintamos números, es decir, al pulsar el botón, se irá rellenando el textarea con líneas numeradas del uno al 100.

En el código del evento click del botón ponemos ésto:

Public Sub Button1_Click()

Dim n As Integer

For n = 0 To 100
    TextArea1.Text &= Str(n) & "\n"
Next  
End
 


Pulsamos el botón y vemos que así es, efectivamente, pero se han dibujado "de golpe" tras una pausa (si vuestro ordenador es muy rápido cambiad 100 por 1000). No hemos conseguido el efecto de que se vaya redibujando el Textarea en cada interacción del bucle for, sólo al final. No es eso lo que quiero, quiero estar informado paso a paso de lo que el programa está haciendo. ¿Cómo puedo hacer eso?
Puedes llamar de forma recursiva al lazo de eventos usando la instrucción WAIT.
Es decir, cambio el código así
Public Sub Button1_Click()

Dim n As Integer

For n = 0 To 100
    TextArea1.Text &= Str(n) & "\n"
    WAIT 0.01
Next  

End
 

Ejecuto el programa y vemos como, ahora sí, van apareciendo los números en el textarea de uno en uno según progresa el bucle for.
Wait (esperar) detiene la ejecución de nuestro programa el tiempo que se le indique. En este caso una centésima de segundo pero antes de detenerlo procesa el bucle de eventos, es decir ejecuta todo lo que haya pendiente (en este caso dibujar el textarea).
Hay que tener cuidado con ésto en según qué circunstancias y según qué controles o nos podemos encontrar en un bucle infinito.
Por ejemplo, considerar éste código en el que hemos añadido un checkbox al formulario de antes y sustituido el código por éste:

Public n As Integer

Public Sub Button1_Click()

While n < 1000
    TextArea1.Text &= Str(n) & "\n"
    CheckBox1.Value = Not CheckBox1.Value
    Wait 0.01
    n += 1
Wend

End

Public Sub CheckBox1_Click()

    n = 0

End
 


Esto conllevará una recursión infinita (al cambiar el value del checkbox, éste dispara su evento Click que a su vez cambia el valor de n)

WAIT enlentece el bucle, por supuesto, pero es el único modo de refrescar la interfaz de usuario durante la ejecución de un bucle.

Este bucle es el encargado de redibujar toda la interfaz gráfica cuando hay formularios que tengan activada la propiedad Arrangement a alguno de sus valores y contengan controles "autoredimensionables" que tengan establecidos  a su vez las propiedades Arrangment, Expand, Autoresize , margin, spacing y padding. La más importante de estas propiedades a efectos del redimensionamiento y recolocación de los controles es la propiedad "Arrangement" que ya ha sido tratada en otros hilos de este foro.

Espero que esto os sirva de ayuda.



 
última edición por shordi el Miercoles, 11 May 2016, 04:20; editado 2 veces 
shordi - Ver perfil del usuario Enviar mensaje privado  
shordi [ Martes, 10 May 2016, 10:30 ]
 


El Bucle (o Lazo) De Eventos (Event Loop)
Comentarios
Mostrar mensajes anteriores:    
 
Publicar nuevo tema  Responder al tema  Página 1 de 1
 
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 



 

cron