Beruflich Dokumente
Kultur Dokumente
1 / 29
Contenido
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Preliminares
Programacion secuencial vs. dirigida por eventos I
Programacion secuencial vs. dirigida por eventos II
Esqueleto de una aplicaci
on dirigida por eventos I
Esqueleto de una aplicaci
on dirigida por eventos II
Diagrama de una aplicaci
on dirigida por eventos
Y todo esto en Vala...
Ejemplo de se
nal en Vala I
Ejemplo de se
nal en Vala IIa
Ejemplo de se
nal en Vala IIb
Ejemplo de se
nal en Vala IIc
Ejercicio en clase. Preparaci
on para la ejecucion diferida de codigo (I)
Ejercicio en clase. Preparaci
on para la ejecucion diferida de codigo (II)
Ejecucion diferida de c
odigo. Preliminares (I)
Ejecucion diferida de c
odigo. Preliminares (II). Ejercicio en clase
Ejecucion diferida de c
odigo. Preliminares (III)
El principio de HollyWood (I)
El principio de HollyWood (II)
Y todo esto en Vala...
Se
nales en Vala. Lo basico
Se
nales y funciones Lambda ()
Desconexion de se
nales en Vala (I)
Desconexion de se
nales en Vala (II)
Se
nales con enlace dinamico en Vala (I)
Se
nales con enlace dinamico en Vala (II)
2 / 29
Preliminares
En t
erminos de la estructura y la ejecuci
on de una aplicacion
ejecuta este esta determinada por los sucesos (eventos) que ocurren
como consecuencia de la interacci
on con el mundo exterior.
Podemos afirmar que representa un nuevo paradigma de
repetir
presentar menu () ;
opc = l e e r o p c i o n ( ) ;
...
s i ( opc == 1 ) e n t o n c e s a c c i o n 1 ( ) ;
s i ( opc == 2 ) e n t o n c e s a c c i o n 2 ( ) ;
...
hasta terminar
En la programaci
on dirigida por eventos indicamos:
Qu
e cosas -eventos- pueden ocurrir?
Lo que hay que hacer cuando ocurran
2
4
6
8
s o n e v e n t o s ( ev1 , ev2 , e v 3 . . . ) ;
...
c u a n d o o c u r r a ( ev1 , a c c i o n 1 ) ;
c u a n d o o c u r r a ( ev2 , a c c i o n 2 ) ;
...
repetir
...
hasta terminar
4 / 29
la aplicacion.
Esto implica tener que llevar cuidado con el dise
no de la aplicacion
5 / 29
sistema de eventos.
Se definen todos los eventos que pueden ocurrir.
Se prepara el generador o generadores de estos eventos.
Se indica qu
e codigo se ejecutara en respuesta a un evento producido
-ejecucion diferida de c
odigo-.
Se espera a que se vayan produciendo los eventos.
6 / 29
aplicacion.
A esta ejecuci
on ininterrumpida es a lo que se conoce como el bucle
de espera de eventos.
Las aplicaciones con un interfaz gr
afico de usuario siguen este
esquema de programaci
on que acabamos de comentar.
Podemos verlo de forma gr
afica en el siguiente diagrama:
7 / 29
Generador de Eventos
* La cola de
eventos no es
estrictamente
necesaria.
Cola de Eventos
Dispatcher
Manejador1
Manejador2
Manejador3
Manejadorn
8 / 29
9 / 29
2
4
void f1 ( int n) { . . . }
void f2 ( int n) { . . . }
p u b l i c c l a s s T e s t : GLib . O b j e c t {
p u b l i c s i g n a l v o i d s i g 1 ( i n t a ) ; // <=== SIGNAL
6
p u b l i c s t a t i c i n t main ( s t r i n g [ ]
T e s t t 1 = new T e s t ( ) ;
8
10
args ) {
t1 . s i g 1 . connect ( f1 ) ;
t1 . s i g 1 . connect ( f2 ) ;
...
// C o n e x i o n de l a s e n y a l
// con e l c o d i g o a e j e c u t a r
// Lo v e r e m o s en e l p r o x i m o
// tema .
12
14
16
t1 . s i g 1 (2) ;
18
20
// E m i s i o n de l a s e n y a l
// E q u i v a l e a l l a m a r a : f 1 ( 2 ) ; f 2 ( 2 )
return 0;
}
22
10 / 29
2
4
6
c l a s s P l a y e r : GLib . O b j e c t {
p u b l i c P l a y e r . with name ( s t r i n g n ) {
name = n ;
t r i e s = 0;
new try . connect ( r e c o r d t r y ) ;
}
10
12
14
16
18
20
22
void p l a y e r t r y ( Player p) {
s t d o u t . p r i n t f ( " The player [ %s ] tried one more time \ n " ,
p . get name ( ) ) ;
}
24
11 / 29
1
3
v o i d main ( ) {
const i n t max tries = 2;
v a r j u a n = new P l a y e r . w i t h n a m e ( " Juan " ) ;
v a r p e d r o = new P l a y e r . w i t h n a m e ( " Pedro " ) ;
5
juan . new try . connect ( p l a y e r t r y ) ;
pedro . new try . connect ( p l a y e r t r y ) ;
7
9
11
13
i ++) {
12 / 29
the
The
the
The
the
The
the
The
player
player
player
player
player
player
player
player
13 / 29
La ejecuci
on diferida de c
odigo tiene sus orgenes en el concepto de
Callback
En Lenguaje C un Callback no es m
as que un puntero a una funcion.
Vamos a comenzar a preparar en clase un ejercicio que haremos en las
14 / 29
En la biblioteca est
andar de C (#include <stdlib.h>) disponemos
v o i d q s o r t ( v o i d base , s i z e t nmemb , s i z e t s i z e ,
i n t ( compar ) ( c o n s t v o i d , c o n s t v o i d ) ) ;
15 / 29
i n t i n t c m p ( c o n s t v o i d pe1 , c o n s t v o i d pe2 ) {
i n t e1 = ( ( c o n s t i n t ) pe1 ) ;
i n t e2 = ( ( c o n s t i n t ) pe2 ) ;
4
r e t u r n e1e2 ;
6
i n t main ( ) {
i n t v [ 4 ] = {4 ,0 , 1 ,7};
10
f o r ( i n t i = 0 ; i < 4 ; i ++)
p r i n t f ( " v[ %d]= %d \ n " , i , v [ i ] ) ;
12
14
16
18
20
diferida
Punteros a funciones.
16 / 29
Tambi
en sabemos que Vala nos permite hacerlo mejor que C:
signal + connect.
Pero tambi
en sabemos que es compatible con bibliotecas de C. . .
Echa un vistazo a la biblioteca de compatibilidad con Posix de C:
17 / 29
de C++:
libsigc++
signal/slot
boost::signals
En la documentaci
on de cada una de estas tres implementaciones de
18 / 29
Puedes consultar m
as informaci
on sobre el aqu .
Si quieres ampliar m
as tus conocimientos sobre el debes saber que a
Inversi
on de control ( IoC ).
Inyecci
on de dependencias (
DI
).
Puedes ampliar m
as informaci
on sobre estas tecnicas de programacion
20 / 29
4
6
p u b l i c s t a t i c i n t main ( s t r i n g [ ]
T e s t t 1 = new T e s t ( ) ;
args ) {
8
t 1 . s i g 1 . c o n n e c t ( t 1 .m) ;
10
t1 . s i g 1 (5) ;
12
return 0;
}
14
}
21 / 29
con la de la propia se
nal...
...salvo que en Vala se permite: Importante!
1
2
22 / 29
todas estas:
1
3
5
7
9
p u b l i c c l a s s Foo : O b j e c t {
p u b l i c s i g n a l void some event ( i n t x , i n t y , double z ) ;
// . . .
}
. . . // l a s s i g u i e n t e s f u n c i o n e s pueden c o n e c t a r s e a s o m e e v e n t
void on some event ()
void on some event ( i n t x )
void on some event ( i n t x , i n t y )
void on some event ( i n t x , i n t y , double z )
v o i d o n s o m e e v e n t ( Foo s o u r c e , i n t x , i n t y , d o u b l e z )
23 / 29
as usando funciones-:
2
4
p u b l i c c l a s s T e s t : GLib . O b j e c t {
public s i g n a l void s i g 1 ( int a) ;
p u b l i c s t a t i c i n t main ( s t r i n g [ ] a r g s ) {
T e s t t 1 = new T e s t ( ) ;
t 1 . s i g 1 . c o n n e c t ( ( t , a ) => { s t d o u t . p r i n t f ( " %d \ n " , a ) ; } ) ;
t1 . s i g 1 (5) ;
6
8
return 0;
}
10
}
Pregunta: Qu
e son t y a ? Que representa cada uno?
24 / 29
inverso a la conexion.
Podemos hacerlo de varias maneras, el caso m
as sencillo es usar el
Pero qu
e ocurre si lo que habamos conectado era una
25 / 29
El truco est
a en saber que el metodo connect devuelve un valor de
u l o n g s i g i d = f o o . s o m e e v e n t . c o n n e c t ( ( ) => { / . . . / }) ;
foo . some event . disconnect ( s i g i d ) ;
26 / 29
declara virtual.
Cuando una se
nal se declara virtual puede tener una
c l a s s Demo : O b j e c t {
public v i r t u a l s i g n a l void s i g () {
s t d o u t . p r i n t f ( " callback por defecto \ n " ) ;
}
}
6
8
10
c l a s s Sub : Demo {
public override void s i g () {
s t d o u t . p r i n t f ( " Reemplazo del callback por defecto \ n " ) ;
}
}
27 / 29
callbacks?..s.
IMPORTANTE : Se ejecutan antes que el callback por defecto.
Existe la posibilidad de conectar callbacks que se ejecutan despu
es
v o i d main ( ) {
v a r demo = new Demo ( ) ;
demo . s i g . c o n n e c t ( ( ) => s t d o u t . p r i n t f ( " antes \ n " ) ) ;
demo . s i g . c o n n e c t a f t e r ( ( ) => s t d o u t . p r i n t f ( " despues \ n " ) ) ;
demo . s i g ( ) ; // e m i t i m o s l a s e n y a l
}
7
9
11
//
//
//
//
Resultado :
antes
c a l l b a c k por d e f e c t o
despues
28 / 29
programa de prueba que cree una casa, con varias habitaciones y cada
una de ellas con varias puertas/ventanas/luces.
Comprueba que, efectivamente, cuando alguien abre una puerta,
enciende una luz o sube una persiana, el sistema domotico nos avisa
de ello.
29 / 29