Curs 5 Paradigma orientata eveniment
Transcript of Curs 5 Paradigma orientata eveniment
Curs 5
1
EvenimenteUn eveniment poate fi definit ca un tip
de semnal catre program.
Acesta ii indica programului ca ceva s-a intamplat
Forma generala a unui eveniment in EDP
Paradigma orientata eveniment Sistemul asteapta evenimentele (generate de utilizator
(in principal)) si acestea vor declansa (trigger) metodele de tratarea a lor.
Polling
Interrupt-driven
Event-driven
Tratarea evenimentelor asincrone
Metoda 1 - PollingInteractiunea este guvernata de o bucla infinita:
Loop forever:
{ i=1..n
read input i
respond to input I
inc I }
Metoda #2 Interrupt-driven
Metoda #3: Event-driven Interactiunea este din nou guvernat de o bucla:main()
{
while(true)
{
Event e = get_event();//primeste eveniment
process_event(e); // trateaza eveniment
}
}
Avantajele procesarii orientate eveniment
Sunt mai portabile
Permit tratarea mai rapida
Se pot folosi de suportul sistemului de operare
Incurajeaza reutilizarea codului.
1. Generatoare de evenimente: tastura si maus
2. Sursa evenimente: sistem sau definit de utilizator
3. Bucla de evenimente: asteapta continuu evenimente sprea fi tratate
4. Gestionari de evenimente: metodele necesare tratariieveenimentelor (majoritatea definite de utilizator, unelefiind ale sistemului)
5. Event mapper: distribuite evenimentele catre gestionariicorespunzatori fiecaruia
6. Inregistrarea evenimentelor: informeaza un event mapper despre asocierea intre evenimente si gestionari
Diagarama de secventa pentru EDPApp
User
: Event
Handler
: Event
Mapper
: UI
Object
actiuni
Genereazaevenimente
Distribuieevenimente
Inregistreazagestionarul de evenimente
procesareevenimente
Tratarea evenimentelor
10
Dispatcher/Distribuitor/Mapper:
In general programatorul trebuie sa descrietratarea evenimentului.
• registrul de evenimente si cu bucla de evenimente sunt de obicei implementate de sistem
• Aplicatiile implementeaza gestionarul
• gestionarul de evenimente trebuie sa urmezestandardele descrise in interfetele furnizate de sistem
• gestionarul trebuie sa fi inregistrat
EDP – aplicatii consola
12
#include <iostream>using namespace std;int value; // globalint main() {
// Initializationchar s = '+';value = 0;while(1) { // event loop
cout << "Please select an operation (+,-,q): \n";cin >> s; //wait for an event to be generated by the userswitch(s){ //event mapper
case '+': //event registrationadd(); break; //event handler
case '-': //event registrationsub(); break; //event handler
case 'q': //event registrationexit(1); //event handler
}}
return(1); }// event handlersvoid add () { // "+" event handler
int in;cout << "Please select an integer: \n";cin >> in;value += in;cout << "The current value is: " << value << "\n";
}void sub () { // "-" event handler
int in;cout << "Please select an integer: \n";cin >> in;value -= in;cout << "The current value is: " << value << "\n";
}
Secvential EDP
Text putin modest
GUI inutil majoritar
Proiectarea unei aplicatii EDP - GUI
• Stabilirea interactiunii vizuale si a evenimentelor:
Look & Feel
O interfata este buna daca are urmatoarelecaracteristici:
• Eleganta:
• Il ghideaza
• Ofera informatii ajutatoare (hint)
• Foloseste o ierarhie de interfete
• Permite ca utilizatorul sa faca greseli
16
Pick Correlation
Procesul de selectie a unei ferestre sau aplicatiicare trebuie sa trateze un eveniment oarecare(deoarece le apartine) se numeste corelatia de selectie (pick correlation)
Ce sunt widgets? Sunt obiectele din cadrul unui GUI orientat obiect.
Desi fiecare fereastra este un widget
Nu toate widget sunt ferestre
EDP in HTML
19
20
Sectiune de pagina: <div>
<div>Look at me!
</div>
Event-Driven Programming in HTML
Camp text: <input /> Atributul type trebuie setat pe "text"<div>
Name: <input type="text" /></div>
21
Buton: <input />
<div><input type="button" value="Click Me!" />
</div>
Gestionarul de eveniment pentru buton
<div><input type="button" value="Click Me!" onclick="myFunction();" />
</div>
function myFunction() {alert("Hello, world!");
}
22
Citirea date de la utilizator
Un element HTML are urmatoarea structura
23
Identificarea elementelor HTML
<div>Name: <input type="text" id="name" />
</div>
Accesarea elementelor HTML in JavaScript Accesarea unui elemnt HTML prin ID, se face :
document.getElementById("<ID>")
Exemplu:
document.getElementById("name")
24
Accesarea atributeleor elementelor HTML
Sintaxa generala este prezentata mai jos:document.getElementById("<ID>").<attribute>
Exemplu:document.getElementById("name").value
(campurile text stocheaza inputul utilizator in atributul value )
Reanalizam exemplul anterior Snippet HTML
Fisierul JavaScript
<div>Name: <input type="text" id="name" /><br /><input type="button" value="Greet!" onclick="welcome();"
/></div>
function welcome() {var name = document.getElementById("name").value; alert("Hi, " + name + "!");
}
25
Exemplu Snippet HTML
Fisier JavaScript
<div>Name: <input type="text" id="name" /><br />Age: <input type="text" id="age" /><br /><input type="button" value="Submit" onclick="checkAge();"
/></div>
function checkAge() {var userName = document.getElementById("name").value;var age = document.getElementById("age").value;
if (age < 21) {alert(userName + ", you can't drink!");
} else {alert("Hi " + userName + ", drink away!");
}}
26
Schimbarea valorilor atributului Snippet HTML
Fisier JavaScript
<div>Name: <input type="text" id="name" /><br /><input type="button" value="Greet!" onclick="welcome();"
/></div>
function welcome() {var name = document.getElementById("name").value;alert(name + ", I don't like your name. You are now Bob.");document.getElementById("name").value = "Bob";alert("Hi Bob!");
}
EDP in Java
27
Frame in AWT Frame este un container pentru componente
Frame cu controale de
windows normale
Menu Optional
Trei containerein Frame cu
Border Layout
Componente UI in interiorul
containerelorfiecare cu layout
propriu
Exemplu GUI
{Frame}
eticheta{label}
Camp text{textfield}
buton{button}
componente
Clase eveniment
AWTEvent EventObject
AdjustmentEvent
ComponentEvent
TextEvent
ItemEvent
ActionEvent
InputEvent
WindowEvent
MouseEvent
KeyEvent
ContainerEvent
FocusEvent
PaintEvent
ListSelectionEvent
31
Cele mai comune actiuni utilizatorActiune utilizator Obiect Sursa Tip eveniment generat
Apasa un buton Jbutton ActionEvent
Marcheaza o cutie de selectie JCheckBox ItemEvent, ActionEvent
Selecteaza un buton radio JRadioButton ItemEvent, ActionEvent
Apasa return intr-un camp text JTextField ActionEvent
Selecteaza un nou element JComboBox ItemEvent, ActionEvent
Window opened, closed, etc. Window WindowEvent
Mouse pressed, released, etc. Component MouseEvent
Key released, pressed, etc. Component KeyEvent
32
Model de delegare
sursa: SourceClass
+addXListener(listener: XListener)
listener: ListenerClass
Actiune Utilizatorr
Genereaza un eveniment XListener
+handler(event: XEvent)
Inregistrata prin invocarea source.addXListener(listener);
(a) o component sursa cu un gestionar generic
sursa: JButton
+addActionListener(listener: ActionListener)
listener: CustomListenerClass
ActionListener
+actionPerformed(event: ActionEvent)
Inregistrat prin apelul lui source.addActionListener(listener);
(b) O component sursa JButton cu un gestionar ActionListener
33
Functii interne ale unei componente sursa
sursa: SourceClass
+addXListener(XListener listener)
(a) Functii interne ale unui obiect sursa generic
event: XEvent listener1 listener2 … listenern
Mentine o lista
Apeleaza/Invoca listener1.handler(event) listener2.handler(event) … listenern.handler(event)
Un eveniment este generat
sursa: JButton
+addActionListener(ActionListener listener)
(b) Functie interna a obiectului JButton
event: ActionEvent
listener1 listener2 … listenern
Mentine o lista
Apeleaza listener1.actionPerformed(event) listener2.actionPerformed(event) … listenern.actionPerformed(event)
Un eveniment este declansat
34
Exemplu model delegareJButton jbt = new JButton("OK");ActionListener listener = new OKListener();jbt.addActionListener(listener);
Clasa Eveniment Interfata Gestionar Metode Gestionar (Handlers)ActionEvent ActionListener actionPerformed(ActionEvent)ItemEvent ItemListener itemStateChanged(ItemEvent)WindowEvent WindowListener windowClosing(WindowEvent)
windowOpened(WindowEvent)windowIconified(WindowEvent)windowDeiconified(WindowEvent)windowClosed(WindowEvent)windowActivated(WindowEvent)windowDeactivated(WindowEvent)
ContainerEvent ContainerListener componentAdded(ContainerEvent)componentRemoved(ContainerEvent)
MouseEvent MouseListener mousePressed(MouseEvent)mouseReleased(MouseEvent)mouseClicked(MouseEvent)mouseExited(MouseEvent)mouseEntered(MouseEvent)
KeyEvent KeyListener keyPressed(KeyEvent)keyReleased(KeyEvent)keyTypeed(KeyEvent)
Selectie gestionare eveniment disponibile
35
java.awt.event.ActionEvent
java.awt.event.ActionEvent
+getActionCommand(): String
+getModifiers(): int
+getWhen(): long
java.util.EventObject
+getSource(): Object
java.awt.event.AWTEvent
36
Gestionari interniO clasa de gestionare / ascultare (listener) este
proiectata pentru a crea un obiect listener pentru o componenta GUI (cum ar fi un buton).
37
O clasa interna anonima O clasa interna anonima este o clasa interioara fara
nume.
O clasa anonima este declarata dupa cum urmeaza:
new NumeSuperClasa/NumeInterfata() {// Implementeza sau suprascrier metodele din superclasa sau
interfata// orice alte metode care mai sunt necesare
}
38
Evenimente Maus
java.awt.event.MouseEvent
+getButton(): int
+getClickCount(): int
+getPoint(): java.awt.Point
+getX(): int
+getY(): int
java.awt.event.InputEvent
+getWhen(): long
+isAltDown(): boolean
+isControlDown(): boolean
+isMetaDown(): boolean
+isShiftDown(): boolean
39
Gestiunea evenimentelor maus Java furnizeaza doua interfete listener: MouseListener si MouseMotionListener, pentruaputea gestiona evenimentele acestuia
java.awt.event.MouseListener
+mousePressed(e: MouseEvent): void
+mouseReleased(e: MouseEvent): void
+mouseClicked(e: MouseEvent): void
+mouseEntered(e: MouseEvent): void
+mouseExited(e: MouseEvent): void
java.awt.event.MouseMotionListener
+mouseDragged(e: MouseEvent): void
+mouseMoved(e: MouseEvent): void
40
Gestiunea evenimentelor tastatura• Pentru a procesa un eveniment de la tastatura se vor folosi
urmatorii gestionari din interfata KeyListener:• keyPressed(KeyEvent e)este apelata la apasarea unei taste• keyReleased(KeyEvent e)apelata la eliberarea unei taste.• keyTyped(KeyEvent e)apelata atunci cand o tasta este apelata
si eliberata.
• Cele mai utilizate definitii de coduri taste sunt• Home VK_HOME• End VK_END• Page Up VK_PGUP• Page Down VK_PGDN
java.awt.event.KeyEvent
+getKeyChar(): char
+getKeyCode(): int
java.awt.event.InputEvent
41
Clasa Timer
javax.swing.Timer
+Timer(delay: int, listener: ActionListener)
+addActionListener(listener: ActionListener): void
+start(): void
+stop(): void
+setDelay(delay: int): void
• Clasa Timer poate fi folosita in controlul animatiei.
• De exemplu pentru afisarea unui mesaj in miscare.
42
AWT vs. SwingJava furnizeaza doua seturi de componente GUI components
("controale")
AWT (Abstract Windowing Toolkit) - este biblioteca initiala de componente (Java 1.0 modificata in Java 1.1)
Utilizeaza modelul de delegare a evenimentelor (din Java 1.1.)
Swing este biblioteca imbunatatita de componente Gui ca parte a JFC (Java Foundation Classes), (dupa Java 1.2)
43
Componentele AWT ”pereche”
Fiecare componenta nativa din AWT are o imagine (sau componenta pereche) in GUI nativ al Windows
Fiecare componenta GUI isi va asuma automat aparenta/imaginea/prezentarea determinata de sistemul de operare gazda
Componentele AWT sunt legate direct catre abilitatile GUI locale ale OS
44
AWT components
45
Modele de proiectare AWT
Modelul Compozit (Composite): organizeazacomponentele intr-o structura ierarhicaarborescenta
Modelu pod (bridge) permite existentametodelor pereche
46
Componente Swing Compnentele Swing sunt scrise, manipulate si afisate
complet in Java
Componentele Swing au prezentarea si comporatamentul (look-and-feel) independente de platforma sistemului de operare gazda
47
Relatia dintre componentele AWT si cele de nivel superior ale Swing
48
Organizarea bibliotecii GUI Biblioteca de clase este organizata ierarhic pornind de la
java.awt.Component
Componentele grele de nivel superior depind de modelul pereche al AWT
Astfel javax.swing.JWindow, javax.swing.JFrame, javax.swing.JDialog, si javax.swing.Japplet,
extind componentele AWT :
java.awt.Window, java.awt.Frame, java.awt.Dialog, si java.applet.Applet
49
Componentele Swing derivate din JComponent
50
Componentele Swing Componentele usoare ale Swing au la baza in
ierarhie pe javax.swing.JComponent
Care la randul ei extinde java.awt.Container
Componentele usoare sunt implementate complet in Java si nu au nici o legatura cu sistemul de operare gazda
51
Model-View-Controller (MVC)
Componentele Swing sunt bazate intern pe arhitectura MVC (Model-View-Controller)
In acest caz orice componenta este impartita in trei obiecte separate:
View
model:
controller:
52
Model-View-Controller (MVC)
De obicei interactiunile dintre controler si view sunt tratate in comun ca la Smalltalk
53
Componente MVC interne din JButton AWT si Swing nu determina totusi arhitectura intregii
aplicatii aceasta ramane la indemana programatorului. .
54
Organizarea componentelor in GUI
Clasele de nivel superior Swing classes - JWindow (Frame fara decoratiuni), JFrame, JDialog, si JApplet –folosesc un content pane implicit pe post de container pentru componente:
add (component); // in cadrul content pane propriu
javax.swing.JPanel si alte containere sunt utilizate sa organizeze containerele intro ierarhie (tridimensionala) conform necesitatilor aplicatiei
55
Gestionare de organizare in pagina Un gestionar de organizare (layout
managers) in pagina este un obiect care gestioneaza atat dimensiunea cat si pozitionarea unei/unor componente intr-un container
56
AWT si Swing furnizeaza un numar de organizatoareimplicite, printre care si:
flow, border, grid, si box
JFrame foloseste organizatorul border layout (Nord, Centru,..)
JPanel foloseste organizatorul flow (linie cu linie)
container.setLayout (new FlowLayout ());
Se poate usor dezvolta propriul gestionar de pozitionare prin implementarea lui LayoutManager(sau LayoutManager2 )
Gestionarii de pozitionare/ organizatorii sunt bazati pemodelul Strategy
Gestionare de organizare in pagina
57
Cateva organizatoare pentru unele containere
58
Tratarea evenimentelor GUI
Folosirea gestionarilor de evenimente om Java este numit modelul cu delegarea evenimentelor :
Procesarea unui eveniment este
Cand o componenta GUI este creata, se va inregistra si gestionarul de evenimente
Acesta va gestiona evenimente
59
Tratarea evenimentelor GUI Un gestionar de evenimente poate asculta / primi
evenimente de la mai multe surse de evenimente si de asemenea trata evenimente de diverse tipuri
component.addXListener (aListener);
60
Tratarea evenimentelor GUI void eventHandler (EventType event) { . . }
class MyClass implements EventTypeListener
{ . .
public void eventHandler (EventType e) {
// procesarea evenimet . .
}
}
De obicei gestionarii sunt definiti ca clase interioare anonime
. . new EventTypeListener () {
public void eventHandler (EventType e) {
poate accesa obiectul inclus }}
61
Ierarhia de evenimentea Java
etc..
62
Tratarea evenimentelor GUI
in AWT, fiecarui obiect eveniment i se asociaza un identificator
Interfetele pentru gestionarii de eveniment pot furniza multiple metode care sa separe un eveniment pe diverse nivele de detaliu (pressed, released, clicked)
63
Exemplu evenimente mauspublic class MouseFrame extends JFrame{
public MouseFrame () {
setSize (250, 300); setTitle ("Mouse moves");addMouseMotionListener
(new MouseMotionAdapter ()
{public void mouseMoved (MouseEvent e)
{System.out.println ("Mouse moved to [" +
e.getX () + ", " + e.getY ()+ "]");}
});
}}
64
Obiecte eveniment si clase gestionarActionEvent ActionListener
WindowEvent WindowListener
WindowAdapter
MouseEvent MouseListener
MouseAdapter
MouseMotionListener
MouseMotionAdapter
KeyEvent KeyListener
KeyAdapter
ItemEvent ItemListener
• XListener este o interfata
• XAdapter este o clasa care implementeaza interfatagestionar corespunzatoare
etc.
65
Tratarea evenimentelor GUI Observatii de implementare a gestionarilor
Nu trebuie efectuate calcule consumatoare de timp sau apelate explicit functii de intarziere in cadrul gestionarilor de eveniment ( exact ca la intreruperi)
Altfel interfata utilizatir a programului se va bloca deoarece evenimentele vor astepta in coada spre a fi tratate
66
Crearea unui frame simpluimport javax.swing.JFrame;
public class SimpleFrame extends JFrame
{
public static void main (String [ ] args) {
new SimpleFrame ().setVisible (true);
}
}
67
Cum se inchide corect o aplicatieimport javax.swing.*;
import java.awt.event.*;
public class ClosingFrame extends JFrame
{
public static void main (String [ ] args) {
JFrame frame = new ClosingFrame ();
frame.setSize (300, 200);
frame.addWindowListener (
new WindowAdapter () {
public void windowClosing(WindowEvent e) {
System.exit (0); }}); // ignora insusi evenimentul
frame.setVisible (true); frame.toFront ();
}
}
68
Ca si mai inainte metoida main creaza o fereastra (ClosingFrame), dar de aceasta data se vor defini niste proprietati (size) si apoi lasa controlul pentru procesare inputului utilizatorului
Cum se inchide corect o aplicatie
69
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class ButtonFrame extends JFrame {
private JButton button = new JButton ("Push");
private JPanel panel = new JPanel ();
. .
public static void main (String [ ] args) {
JFrame frame = new ButtonFrame ();
frame.setDefaultCloseOperation
(JFrame.EXIT_ON_CLOSE);
frame.setVisible (true); frame.pack ();
} . .
Adaugarea de componente la o fereastra
70
public ButtonFrame () // constructor
{
panel.add (button); // foloseste flow layout
add (panel); // implicit: CENTER
button.addActionListener (new ActionListener () {
public void actionPerformed (ActionEvent e) {
String text = button.getText () + ", again";
button.setText (text);
pack (); }});
}
Adaugarea de componente la o fereastra
EDP in .NET
71
WinForms WinForms - Este o alta denumire pentru aplicatii GUI
standard de tip windows
Abstractizare FCL se comporta ca un strat de abstractizare
System.Windows.Forms.Form
CLR
Windows OS
instantaclasei FCLobiect
Proprietatile Form
Acestea controleaza aparenta vizuala:
– AutoScroll
– BackgroundImage
– ControlBox
– FormBorderStyle (modificabil in dimensiune?)
– Icon
– Location
– Size
– StartPosition
– Text (i.e. de exemplu captura unei ferestre (caption)
– WindowState (minimizata, maximizata, normala)
Form1 form;form = new Form1();form.WindowState = FormWindowState.Maximized;form.Show();
Metodele Form Actiunile care pot fi efectuate de catre
un Form :
– Activate:
– Close:
– Hide:
– Refresh:
– Show:
– ShowDialog:
form.Hide(); ...
form.Show();
Evenimentele formei
– Load:
– Closing:
– Closed:
– Resize:
– Click:
– KeyPress:
Exemple
Intreaba utilizatorul inainte de a inchide
forma:private void Form1_Closing(object sender,
System.ComponentModel.CancelEventArgs e){
DialogResult r;
r = MessageBox.Show("Do you really want to close?", "MyApp", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);
if (r == DialogResult.No)e.Cancel = true;
}
Codul din spate
Evenimentele sunt gestionate de metode care sunt “in spatele” interfetei vizuale
Functii de tratare a evenimentelor (Call-backs)
Evenimentele sunt apelate de obiecte ascunse (din spate)…
Mai jos este prezentat “Codul din spate” al Form…
Proiectarea codului
Controale Sunt obiecte UI (User-interface)
de forma :
Etichete
butoane
Cutii text
Menu-ri
Cutii de listare sau mixte
Butoane de optiuni
Cutii de selectie
etc.
Abstractiuni Ca si formele (forms), controalele sunt bazate pe clase
din Framework Class Library – FCL cum ar fi:
System.Windows.Forms.Label
System.Windows.Forms.TextBox
System.Windows.Forms.Button
etc.
Controalele sunt instante
ale acestor clase
obiect
obiect
obiect
obiect
obiect
obiect
Cine creaza aceste obiecte? Codul de control al instantelor
Este auto generat automat de catre Visual Studio
Cand o forma este creata sunt create si controalele ei
Butoane de comanda Foloste pentru utilizatorul care
efectueaza un task (accepta/nu nisteoptiuni, etc)
Proprietati mai importante:– Text:
– Font:
– Enabled:
Evenimente mai importante:– Click:
private void cmdAdd_Click(...){
int i, j, k;i = System.Convert.ToInt32( this.txtNum1.Text );j = System.Convert.ToInt32( this.txtNum2.Text );k = i + j; MessageBox.Show( "Sum = " + k.ToString() );
}
Cutii de text Foloste pentru afisare text sau pentru introducere /
modificare date Propprietati de baza:
– Text:refere continutul text (a string)– Modified:– ReadOnly:
Diverse tipuri de cutii text– MultiLine:– ScrollBars:
Evenimente mai importante:– Enter, Leave:– KeyPress:– KeyDown, KeyUp:– TextChanged:– Validating si Validated
Python Event Driven Programming
86
EDP in Python folosind cs1graphics
class BasicHandler(EventHandler):
def handle(self, event):
print 'Event Triggered'
Inregistrarea unui gestionar pentru un obiect grafic
Codul urmator va afisa 'Event Triggered' de fiecare data cand se da un click pe Canvas.
simple = BasicHandler()
# se creaza gestionarul obiectului
paper = Canvas()
paper.addHandler(simple)
#se asociaza/ataseaza gestionarul la obiectulgestionat
Un gestionar care retine starile (statefull)#in acest caz gestionarul va retine numarul total de click-uri care #au fost efectuate asupra lui si il va afisa la consolaclass CountingHandler(EventHandler):
def __init__(self):EventHandler.__init__(self) #apel parinteself.__count = 0 #constructor
def handle(self, event):self._count += 1print 'Event Triggered. Count: ', self._count
class TallyHandler(EventHandler):
def __init__(self, textObj):EventHandler.__init__(self)
self.__count = 0
self._text = textObj
self._textObj.setMessage(str(self._count)) #reset la 0
def handle(self, event):self._count += 1
self._textObj.setMessage(str(self._count))
90
Gestionar care se inchide dupa un singur evenimentclass HandleOnce(EventHandler):
def __init__(self, eventTrigger):EventHandler.__init__(self)self._trigger = eventTrigger
def handle(self, event):print "That's all folks!!!"self._trigger.removeHandler(self)
paper = Canvas( )oneTime = HandleOnce(paper)paper.addHandler(oneTime)
paper = Canvas(100,100)
score = Text(' ', 12, Point(40,40))
paper.add(score)
referee = TallyHandler(score) #creare gestionar
paper.addHandler(referee) #activare gestionar
Un gestionar care retine starile (statefull)
91
Evenimente Maus Pentru a afla tipul evenimentului se va folosi metoda
getDescription(). In cazul soricelului tipurile de eveniment pot fi :
'mouse click' – buton de maus apasat 'mouse release' – buton de maus eliberat 'mouse drag' – maus miscat
Pentru a afla coordonatele maus-ului se va folosi metodagetMouseLocation().
Aceasta va intoarce coordonatele maus cand se face click.
#Deseneaza un cerc atunci cand se da un click pe maus.class CircleDrawHandler(EventHandler):
def handle(self, event):if event.getDescription() == 'mouse click':
c = Circle(5, event.getMouseLocation())event.getTrigger().add(c) #adauga cercul la canvas
92
Evenimente Mauspaper = Canvas(100,100)handler = CircleDrawHandler( )paper.addHandler(handler)
93
class ClickAndReleaseHandler(EventHandler):def __init__(self):
EventHandler.__init__(self)self._mouseDragged = False
def handle(self, event):if event.getDescription( ) = 'mouse click':
self._mouseDragged = Falseelif event.getDescription() = 'mouse drag'
self._mouseDragged = Trueelif event.getDescription() == 'mouse release':
if self._mouseDragged:print 'Mouse was dragged'
else:print 'Mouse was clicked without dragging'
paper = Canvas( )dragDetector = ClickAndReleaseHandler()paper.addHandler(dragDetector)
94
Evenimente de tastatura Se poate folosi metoda getKey() care va determina care cheie a
fost apasata Mai jos este un cod ce afiseaza tasta apasata intr-un widget tip
Canvas Text.class KeyHandler(EventHandler):
def __init__(self, textObj):EventHandler.__init__(self)self._textobj = textObj
def handle(self, event):if event.getDescription( ) = 'keyboard':
self._textObj.setMessage(self._textObj.getMessage() +event.getKey())
elif event.getDescription() = 'mouse click'self._textObj.setMessage(' ') #sterge textul
paper = Canvas( )textDisplay = Text(' ', 12, Point(100,100))paper.add(textDisplay)echo = KeyHandler(textDisplay)paper.addHandler(echo)
95
Timerealarm = timer(10, True)
#10: ceas-ul va genera un eveniment dupa 10 secunde.
#True: inseamna ca ceas-ul va repeta la nesfarsit secventa la 10s.
alarm.start() #porneste ceasul.
Urmatorul exemplu bate secunda.
alarm = Timer(1, True)
stopwatch = CountingHandler()
alarm.addHandler(stopwatch)
print 'Ready . . .'
alarm.start( ) #afiseaza gata la fiecare secunda.
96
Rotirea unui cerc Urmatorul exemplu roteste un cerc in jurul unui punct
din afara cercului.class RotationHandler(EventHandler):
def __init__(self, shape):self._shape = shape
def handle(self, event):self._shape.rotate
paper = Canvas(100,100)sampleCircle = Circle(20, Point(50,20))sampleCircle.adjustReference(0,30)paper.add(sampleCircle)alarm = Timer(0.1, True)rotator = RotationHandler(sampleCircle)alarm.addHandler(rotator)alarm.start()
97
Utilizarea monitarelorclass ShapeHandler(EventHandler):
def __init__(self, monitor):EventHandler.__init__(self)self._monitor = monitor
def handle(self, event):if event.getDescription( ) == 'mouse drag':
self._monitor.release( ) #elibereaza la miscarea mauspaper = Canvas()checkpoint = Monitor()handler = ShapeHandler(checkpoint)cir = Circle(10, Point(50,50))cir.setFillColor('blue')cir.addHandler(handler)paper.add(cir)checkpoint.wait() #se asteapta pana cand maus-ul este miscat in interiorul
cerculuipaper.setBackgroundColor('green')
98
Adaugarea si mutarea de forme geometrice(Shape) pe Canvas
class ShapeHandler(EventHandler):
def __init__(self):
EventHandler.__init__(self):
self._mouseDragged= Falsedef handle(self, event):
shape = event.getTrigger( )
if event.getDescription( ) == 'mouse drag':old = event.getOldMouseLocation( )new = event.getMouseLocation( )shape.move(new.getX()–old.getX(),new.getY() -
old.getY( )
99
self._mouseDragged = Trueelif even.getDescription( ) == 'mouse click':
self._mouseDragged = Falseelif event.getDescription() == 'mouse release':
if not self._mouseDragged:shape.scale(1.5)
elif event.getDescription() == 'keyboard':shape.setFillColor(Color.randomColor())
class NewShapeHandler(EventHandler):
def __init__(self):
EventHandler.__init__(self)
self._shapeCode = 0
self._handler = ShapeHandler()
#o singura instanta va gestiona toate formele
Adaugarea si mutarea de forme geometrice(Shape) pe Canvas
100
def handle(self, event):if event.getDescription() == 'mouse click':
s = Circle(10)elif self._shapeCode == 1:
s = Square(10)elif self._shAapeCode == 2
s = Rectangle(15, 5)elif self._shapeCode == 3:
s = Polygon(Point(5,5), Point(0,-5),Point(-5,5))self._shapeCode = (self._shapeCode+1)% 4#avanseaza ciclic (prin multimea de forme)s.move(event.getMouseLocation().getX(),
event.getMouseLocation().getY())s.setFillColor('white')event.getTrigger().add(s) #adauga shape la canvass.addHandler(self._handler)
#inregistreaza ShapeHandler cu noul Shapepaper = Canvas(400, 300, 'white', 'Click me!')paper.addHandler(self._handler) #instantiaza gestionarul si le inregistreaza pe toate o data
Adaugarea si mutarea de forme geometrice (Shape) pe Canvas
Clase eveniment pentru Android
Looper
Handler
MessageQueue
Message
Adaugare servicii in Android (versiunea newbie)
UI clicks and
intents
Activity
Activity
Receiver
main event loop
main/UI thread
Service
Provider
Service
binder thread pool
incoming binder
messages
103
‹Event-driven ‹architecture
‹(EDA)
Arhitectura orientata eveniment EDA ?
‹ Reprezinta un model arhitectural care promoveaza detectia, consumul si reactia la apariatia unor evenimente
Producatorevenimente
Procesorevenimente
Consumatorde
evenimente
Comportamentul bazat pe evenimente al unei aplicatii
Event-driven apps
Observare
Procesarepredictiva
Diseminareainformatiei
Comportamentoperational
dinamic
Diagnostic activ
Ratiuni pentru dezvoltarea de aplicatiibazate pe EDP/EDA
‹ Exploatarea mai buna a paralelismului intrinsec si extrinsec
‹ O mai buna proiectare a sistemului‹ (de obicei fiecare eveniment isi are propriul gestionare (single
responsibility)
‹ Reducerea dependentelor din system (dependencies)
‹ Reducera gradului de cuplare intre module (coupling)
‹ Testare mai usoara
‹ Monitorizare in timpul executiei
‹ Scalabilitate
‹ O intretinere mai usoara
‹ etc
Publicare/Subscriere - PubSub
Publisher
Topica
Subscriber Subscriber
Consuma evenimentul
Publica un eveniment
Consuma evenimentul
Publicare/Subscriere bazata pe topica
Publisher
Topica
Subscriber Subscriber
Publica evenimentul
SubtopicaSubscriber
Consuma evenimentul
Consuma evenimentul Consuma evenimentul
Punct la Punct
Publisher SubscriberQueue
Cerere-Raspuns
Publisher/Subscriber
SubscriberTopic
Subscriber
Subscriber
Stocheaza si Retrimite
Publisher /Subscriber
SubscriberTopic
Subscriber
Subscriber
Data
Pipeline
Publisher SubscriberTopic Subscriber Subscriber
Mesaje inter- si intra- module/entitati‹ Transfer intern de mesaje in memorie cu cu ajutorul
selectorului de devenimente (dispatcher)
‹
‹ Transfer intra- se poate realiza folosind
‹
Products and technologies‹ Produse bazate pe protocolul XMPP
‹ Ejabberd
‹ Produse bazate pe protocolul AMQP ‹ RabbitMQ
‹ OpenAMQP
‹ Apache QPID
‹ Produse bazate pe protocolul STOMP ‹ ActiveMQ
‹ JMS
‹ Altele (MS)‹ MSMQ
‹ Azure Service Bus
‹ ZeroMQ
XMPP Extensible Messaging and Presence Protocol
(XMPP)
Un protocol de comunicare pentru aplicatii midlewareorientate pe mesaje care foloseste XML
115
AMQP protocol The Advanced Message Queuing Protocol (AMQP)
Protocol pentru layer de aplicatii open standard folosit in middleware orientate mesaj
RabbitMQ este un broker de mesaje open source saumiddleware orientat pe mesaje care implementeaza protocolul(AMQP).
RabbitMQ
STOMP Simple (or Streaming) Text Oriented Message Protocol
(STOMP), CUNOSCUT ANTERIOR CA TTMP, este un protocol simplu bazat pe text specific middleware orientate mesaj
ActiveMQ Apache ActiveMQ este un broker de mesaje open
source scris in Java impreuna cu un client complet de Java Message Service (JMS).
118
JMS API-ul Java Message Service (JMS) este un
middleware orientat pe servicii bazat pe Java (MOM) API
119
MSMQ Microsoft Message Queuing sau MSMQ este o
coada de mesaje deszoltata de MS si instalata in serverele acestuia incepand cu NT4
120
Windows Azure Service Bus
O infrastructura pentru comunicare prin mesaje intreaplicatii folosita pentru
ZeroMQ
ØMQ un alt sistem de mesaje orienta pemiddleware utilizat pentru dezvoltarejocuri, servicii financiare, sisteme embededcercetare si industria aerospatiala
121
122
Procesarea evenimentelor complexe
“Complex Event Processing (CEP) reprezinta un set detehnici si instrumente folosite pentru a intelege sicontrola sistemele de infomatii conduse/bazate peevenimente
Ceeste un eveniment complex ?• Un eveniment care apare ca un rezultat al unei
combinatii complexe de alte evenimente
•
123
EDA Definition:• Au o buna decuplare intre module – creatorul
evenimentului nu are ciunostiinte depreconsumarea acestuia
• Stiluri de procesare a unui eveniment• Procesare simpla –• Procesare pe flux: • Procesare complexa:
CEP – este o parte a EDA - Event Driven Architecture
124
Exemplu de arhitectura EDA
125
Aplicatii tipice CEP
126
CEP Comparison to traditional App
SQL – standard query language
Datele sunt mai statice in general
Query complexe sunt rare
Nu este potrivita pentru >mii queries / second
Se pot crea declansatoare peeveniment dar sunt lente
Referinte http://www.cs.gsu.edu/~cscnxx/index-2310.html
http://www.december.com/html/x1
http://www.cs1graphics.org/
David Luckham, The Power of Events: An Introduction to Complex Event Processing in Distributed Enterprise Systems Hardcover , Addison-Wesley Professional, 2002
http://www.complexevents.com/
http://dist.codehaus.org/esper/NYJavaSIG_May_30_2007.pdf
127
No Events here!!!
128