Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
El Bucle (o Lazo) De Eventos (Event Loop)
Autor Mensaje
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.
 




===================
No podemos regresar
 
última edición por shordi el Miercoles, 11 May 2016, 04:20; editado 2 veces 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Bucle Do While Shell General 2 Martes, 09 Julio 2013, 20:34 Ver último mensaje
Shell
No hay nuevos mensajes Event Loop Alaplancha General 5 Lunes, 12 May 2014, 06:47 Ver último mensaje
Alaplancha
No hay nuevos mensajes Gb.gtk: Warning: Calling The Event Loop Du... v3ctor General 9 Lunes, 06 Abril 2015, 06:25 Ver último mensaje
shordi
No hay nuevos mensajes Menu Editor Y Herencia Del Control Event mateobadajoz Controles/Librerías/Componentes 7 Viernes, 13 Marzo 2020, 13:47 Ver último mensaje
mateobadajoz
 

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


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron