Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester 2004 1 2 Prof. Bernd Brügge, Ph.D Institut für Informatik Technische Universität.

Ähnliche Präsentationen


Präsentation zum Thema: "Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester 2004 1 2 Prof. Bernd Brügge, Ph.D Institut für Informatik Technische Universität."—  Präsentation transkript:

1 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Prof. Bernd Brügge, Ph.D Institut für Informatik Technische Universität München Sommersemester Juni 2004 Einführung in die Informatik II Ereignis-Basierte Programmierung Addendum

2 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Überblick über diesen Teil v Interaktive Entwicklungsumgebungen v Beispiel: Entwurf der Interaktion in Bumpers Threads und Synchronisation von Methoden (kurz) Das Beispiel stammt aus Gilbert's Buch "Object-oriented Design in Java", Kapitel 9: Implementing Class Relationships: Inheritance and Interfaces, pp

3 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Entwicklungsumgebungen v Compiler helfen beim Übersetzen eines Quellprogramm in ein Zielprogramm v Interaktive Entwicklungsumgebungen sind wesentlich mächtiger. Sie helfen beim Erstellen, Verwalten, Übersetzen und Testen, sowie bei der Versionskontrolle von Quell-und Zielprogrammen. Beispiele von Entwicklungsumgebungen: Eclipse, CodeGuide, CodeWarrior, JBuilder. v Viel Hilfsmittel zur Navigation, Dokumentation, Testen Zugriff auf alle im Programm definierten Bezeichner Visualisierung der Vererbungshierarchie: Klassen-Betrachter Automatische JavaDoc Generierung Einzelschrittausführung des laufenden Programms Setzen von Haltepunkten (breakpoints) Setzen von Beobachtungspunkten (watch points)

4 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Architektur eines (einfachen) Compilers Übersetzer Syntax Baum Symboltabelle QuellprogrammZielprogramm

5 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Architektur von Entwicklungsumgebungen ProjektDatenbank (Quellprogramme, Symboltabellen Syntax Bäume, Zielprogramme, Tests, Daten) Übersetzer Klassenbetrachter ProjektManager Debugger Versionskontroll- System Layout-EditorEditor

6 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Verwaltung von Quellprogrammen v Zur Verwaltung aller Quellprogramme gibt es verschiedene Möglichkeiten. v Makefile, Ant (Unix): Auflistung aller Quellprogramme und deren Compilationsabhängigkeiten Veränderung eines Quellprogramms induziert Übersetzung aller davon abhängigen Quellprogramme v Projekt-Manager (Eclipse, Code-Guide, Code-Warrior): Visuelle Darstellung der Quellprogramme, Übersetzungsstatus, Formulierung von Untergruppen für bestimmte Tests und Versionen, Versionskontrolle.

7 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Projekt-Manager (Code-Warrior) Sicht aller Quell-Programme Programme für Version Bumper04 Sicht aller Versionen (targets)

8 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Zugriff auf Bezeichner

9 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Zugriff auf Klassen-Definitionen

10 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Klassen-Betrachter v Der Klassen-Betrachter erlaubt eine Visualisierung der Klassenhierarchie, wobei Teil-Hierarchien unterdrückt oder gezeigt werden können (Notation nicht in UML):

11 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Entwicklung der Maus-Interaktion in Bumpers Sie kontrollieren ein bestimmtes Auto ( drivenCar ) mit der Maus. v Die Anfangsrichtung der Autos ist zufällig gewählt. v Das Ziel: Werfen Sie mit ihrem Auto soviele Autos wie möglich aus dem Rennen, bevor Ihr Auto aus dem Rennen geworfen wird.

12 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Anwendungsfälle v Erzeugung des Spielfeldes v Auffüllen mit n Autos, wobei zwischen langsamen, schnellen und benutzer-geführten Auto unterschieden werden muss v Unterlegung von Musik für das Spielfeld v Auswählen einer Anfangsposition für ein Auto v Fahren von Autos mit gleichmäßiger Geschwindigkeit v Überprüfung von Kollisionen zwischen Autos Audio-Untermalung für jede Kollision v Überprüfung von Kollisionen von Autos mit dem Spielrand

13 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Zusätzlicher Anwendungsfall Erzeugung des Spielfeldes Auffüllen mit n Autos, wobei zwischen langsamen, schnellen und benutzer-geführten Auto unterschieden werden muss Unterlegung von Musik für das Spielfeld Auswählen einer Anfangsposition für ein Auto Fahren von Autos mit gleichmäßiger Geschwindigkeit Überprüfung von Kollisionen zwischen Autos Audio-Untermalung für jede Kollision Überprüfung von Kollisionen von Autos mit dem Spielrand * Mausklicks zur Änderung der Richtung eines Autos Das Auto bewegt sich mit konstanter Geschwindigkeit in die Richtung des Klicks

14 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Analyse und Entwurfsfragen v Wie stellen wir das Feld da? v Wie modellieren wir das Auto? v Wie animieren wir Autos, die gleichzeitig fahren? v Was machen wir, wenn ein Auto den Rand trifft? v Wie berechnen wir eine Kollision?

15 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Fragen Wie stellen wir das Feld da? Wie modellieren wir das Auto? Wie animieren wir Autos, die gleichzeitig fahren? Was machen wir, wenn ein Auto den Rand trifft? Wie berechnen wir eine Kollision? v Wie lassen wir das Auto auf einen Mausklick reagieren? Wie berechnen wir die neue Route?

16 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Analyse GameBoard Car * startGame() stopGame() runCar() update() paint() Image Width, Height Position Speed getSize() getSpeed() getPosition() Size Image

17 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Instanzdiagramm mit 5 Autos Spiel: Gameboard Auto 1: Car Auto 2: Car Auto 3: Car Auto 4: Car Auto 5: Car

18 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Parallelismus in Bumpers v Wenn Bumpers Interaktionen mit dem Benutzer unterstützen soll, dann muss es 2 parallele Aktivitäten geben: Benutzereingabe ueber die Maus Kontrollfluss des Spiels (Bewegen der Autos, Ueberpruefungen von Kollisionen) v Java unterstuetzt parallele Aktivitaeten mit dem Thread-Konzept

19 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Einschub: Java-Threads v Mehrfachbetrieb (Multitasking) ist die Technik der gleichzeitigen (nebenläufig, engl concurrent) Ausführung von mehreren Program- men auf einer Rechenanlage. v Java unterstützt den Mehrfachbetrieb durch Threads. Eine Java- Thread (Kontrolfaden) ist eine Sequenz von exekutierbaren Anweisungen innerhalb eines Programm, die parallel zu anderen Sequenzen laufen kann. v Die Implementierung der Java Virtual Machine selbst beruht auf Threads: Die Java-Speicherbereinigung (Garbage collection) ist z.B. ein Thread zum Sammeln von nicht länger referenzierten Objekten, der nebenläufig zum Java Programm abläuft. v Auf einem sequentiellen Rechner müssen sich viele Threads einen einzigen Prozessor teilen. Scheduling => Thema der Vorlesung Betriebssysteme

20 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester public class Thread extends Object implements Runnable { // Konstructoren public Thread(); public Thread(Runnable target); public Thread( String name ); // Klassen Methoden public static native void sleep(long ms) throws InterruptedException; public static native void yield(); // Instanz Methoden public final String getName(); public final int getPriority(); public void run(); // Methode der Java-Schnittstelle Runnable public final void setName(); public final void setPriority(); public synchronized native void start(); public final void stop(); } Die Java-Klasse Thread

21 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Jede mit start() gestartete Instanz eines Threads exekutiert als erstes die run() Methode. Unterklassen von Thread überschreiben im allgemeinen die run() Methode von Thread. public abstract interface Runnable { public abstract void run() } Java-Schnittstelle Runnable Thread implementiert die Methode run() der Schnittstelle Runnable. Definition: Jeder Instanz einer Klassse, die die Schnittstelle Runnable, d.h. die Methode run() implementiert, ist ein lauffähiges Objekt. In Bumpers ist die Klasse Referee ein lauffaehiges Objekt!

22 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Die Klasse Referee in Bumpers 6/22/2004 public class Referee implements Runnable { public static AudioClip MUSIC; private static int SLEEP_TIME = 200; private Thread theThread; private boolean isRunning;.... public void startGame() { if(isRunning){ return;} MUSIC.loop(); isRunning = true; theThread=new Thread(this); theThread.start();.... } public void stopGame() { if(!isRunning){ return;} MUSIC.stop(); isRunning = false;... } public void run() { while (isRunning) { try { Thread.sleep(SLEEP_TIME); } catch (InterruptedException e) { e.printStackTrace(); } moveCars(); }.... }

23 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester public class NumberThread extends Thread { int num; public NumberThread(int n) { num = n; } public void run() { for (int k=0; k < 10; k++) { System.out.print(num); } //for } // run() } // NumberThread Ausführung von Threads:Überschreibung von run v Beispiel: Ein Thread, das eine gegebene Nummer 10-mal ausdruckt. Wir definieren NumberThread als Unterklasse von Thread und überschreiben die run() Methode:

24 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester public class Numbers { public static void main(String args[]) { NumberThread number1, number2, number3, number4, number5; number1 = new NumberThread(1); number1.start(); number2 = new NumberThread(2); number2.start(); number3 = new NumberThread(3); number3.start(); number4 = new NumberThread(4); number4.start(); number5 = new NumberThread(5); number5.start(); } // main() } // Numbers Die threads laufen in der Reihenfolge, in der sie gestartet worden sind. Bei kleinem Werten für num ist die Ausgabe noch sequentiell Exekution mehrfacher Threads Hier erzeugen wir 5 Instanzen vom Typ NumberThread und starten dann jede Instanz mit start() :

25 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Exekution mehrfacher Threads Wenn wir den Wert von num erhöhen, überlappt sich die Ausgabe der Threads:

26 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester v Threads kann man auch kreiieren, indem man dem Thread- Konstruktor ein lauffähiges Objekt als Argument übergibt. public class NumberPrinter implements Runnable { int num; public NumberPrinter(int n) { num = n; } public void run() { for (int k=0; k < 10; k++) System.out.print(num); } // run() } // NumberPrinter Thread number1; number1 = new Thread(new NumberPrinter(1)); number1.start(); Alternative Art ein Thread zu implementieren: Runnable NumberPrinter ist ein lauffähiges Objekt, denn es hat run() implementiert.

27 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Zustände eines Threads Zustand Beschreibung Ready Bereit zur Exekution, wartet aber aufs Rechenwerk. Running Ist am Laufen. Waiting Wartet auf ein Ereignis. Sleeping Schläft für eine gegebene Zeit. Blocked Wartet auf Ein/Ausgabe. Dead Ist Terminiert. -> UML Zustandsdiagram Vorlesungsblock über Automaten

28 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Die sleep() Methode Wenn ein Thread seine sleep() Methode aufruft, dann gibt es freiwillig für eine bestimmte Zeit den Prozessor auf. Sobald der Prozessor nichts mehr zu tun hat, nimmt er die Ausführung dieses Threads wieder auf (genauer: der Thread, der am längsten im Zustand ready gewartet hat). v Beispiel: Thread.sleep(SLEEPTIME); catch (InterruptedException e) {....} Wir fangen diese Ausnahme in einem catch -Block ab und bringen das Thread damit wieder in den Zustand ready. v Beispiel: try { Thread.sleep(SLEEPTIME); } Nachdem diese Zeit vorüber ist, wird eine Ausnahme vom Typ InterruptedException erzeugt. (Wir müssen sleep() also in einem try -Block aufrufen).

29 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester GameBoard +getDrivenCar() +getRobotCars() +paint() Referee + void start() +void stop() + void run() +moveCars() +checkForCollisions() Runnable Detaillierter Entwurf unseres Spiels v Wir entwerfen also Referee als lauffähiges Objekt

30 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Synchronisierte Methoden v Wenn wir sicherstellen müssen, dass nur ein Thread zur Zeit in einer Methode sein kann, dann verwenden synchronisierte Methode. v Jede synchronisierte Methode ist mit einem Schloss (lock) versehen. v Wenn eine synchronisierte Methode aufgerufen wird, schliesst sie das Schloss für andere Aufrufer. Während eine Methode geschlossen ist, können keine anderen Threads diese Methode exekutieren. Sie müssen "draussen" warten, bis die Methode ihr Schloss wieder aufgemacht hat. Nach der Exekution des Methodenrumpfes wird das Schloss wieder aufgemacht. Die Klasse DrivenCar enthält synchronisierte Methoden.

31 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Synchronisierte vs nicht-synchronisierte Methoden S1 class DrivenCar { public synchronized void notifyInstruments() { // Rumpf von notifyInstruments }; public List getInstruments() { //Rumpf von getInstruments }; }

32 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Synchronisierte vs nicht-synchronisierte Methoden class DrivenCar { public synchronized void notifyInstruments() { // Rumpf von notifyInstruments }; public List getInstruments() { //Rumpf von getInstruments }; }

33 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Synchronisierte vs nicht-synchronisierte Methoden S1 class DrivenCar { public synchronized void notifyInstruments() { // Rumpf von notifyInstruments }; public List getInstruments() { //Rumpf von getInstruments }; }

34 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Animierung der Autos: Vorüberlegungen v Nachdem des Spielfeld erschaffen worden ist und die Autos ins Spielfeld geladen worden sind, müssen wir sie zum Fahren bringen. Wir machen dies in der run() Methode der Java Schnittstelle runnable() im Spielfeld Solange das Spiel noch läuft (angezeigt durch den Wert der booleschen Varialben isRunning ), durchlaufen wir eine Endlosschleife. Innerhalb dieser Endlosschleife rufen wir die moveCars() Methode, die die aktuelle Positionen der Autos berechnet Um das nicht zu schnell zu wiederholen, bauen wir innerhalb der Endlosschleife eine kleine Verzögerung ein. Solange die Schleife ca 20 mal pro Sekunde ausgeführt wird, ist die Animation relativ flüssig. Wir definieren deshalbe eine Konstante SLEEP_TIME = 30 und rufen die sleep() Methode vom Thread mit diesem Wert auf.

35 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Implementierung der Run() Methode public void stopGame() { if(!isRunning){ return;} MUSIC.stop(); isRunning = false;... } public void run() { while (isRunning) { try { Thread.sleep(SLEEP_TIME); } catch (InterruptedException e) { e.printStackTrace(); } moveCars(); }.... }

36 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Benutzer-kontrolliertes Auto v Das Ziel des Spiels ist, dass wir durch geschickte Mausbewegugen unser Auto so mit anderen Autos kollidieren lassen, dass wir das Spiel gewinnen und nicht von anderen Autos überfahren werden.. v Wir definieren jetzt eine neue Klasse Benutzer-kontrolliertes Auto, dessen Richtung wir mit der Maus kontrollieren können. Wenn der Benutzer die Maus klickt, dann bewegt sich das benutzer-kontrollierte Auto in die Richtung des Mausklicks. Für Mausereignisse gibt es in Java das Ereignis MouseEvent und den Ereignisempfänger MouseListener Für die neue Klasse Benutzer-kontrolliertes Auto ( DrivenCar ) definieren wir einen Ereignisempfänger MouseHandler, der eine Unterklasse von MouseAdapter ist, einer trivialen Implementation von MouseListener. (d.h. eine Implementation mit leeren Rümpfen für alle öffentlichen Methoden von MouseListener ).

37 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester MouseAdapter public abstract class MouseAdapter extends Object implements Mouselistener{ public void mouseClicked(MouseEvent e); public void mouseEntered (MouseEvent e); public void mouseExited(MouseEvent e); public void mousePressed (MouseEvent e); public void mouseReleased (MouseEvent e); }

38 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Runnable Referee + void start() +void stop() + void run() +update(Graphics g) paint()... Gameboard mouseClicked() paint() MouseAdapter MouseListenerMouse

39 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Implementierung von MouseHandler class Mouse extends MouseAdapter { private DrivenCar theDrivenCar; private Gameboard theField; public Mouse(Gameboard playingField, DrivenCar dc) { this.theDrivenCar = dc; this.theField = playingField; this.theField.addMouseListener(this); } public void mousePressed(MouseEvent e) { // Holen der Maus-Koordinaten mit (e.getX(), e.getY()) // Berechnung der neuen Richtung für DrivenCar theDrivenCar.setDirection(degree); }

40 Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester Zusammenfassung v Gezeigt: Entwicklung eines Systems mit einer interaktiven Entwicklungsumgebung v Interaktive Entwicklungsumgebungen vs Compiler Vorteil: Integration vieler Werkzeuge Nachteil: Erhöhter Lernaufwand v Mehrfachbetrieb: Gleichzeitige Ausführung von mehreren Program- men auf einer Rechenanlage. v Java unterstützt Mehrfachbetrieb durch Threads, eine Sequenz von exekutierbaren Anweisungen innerhalb eines Programm, die parallel zu anderen Sequenzen laufen kann. v Kooperation von Threads untereinander erfolgt mit sleep() v Synchronisieren von Thread-Methoden garantiert exklusiven Zugriff auf eine Methode (Monitor-Konzept).


Herunterladen ppt "Copyright 2004 Bernd Brügge Einführung in die Informatik II TUM Sommersemester 2004 1 2 Prof. Bernd Brügge, Ph.D Institut für Informatik Technische Universität."

Ähnliche Präsentationen


Google-Anzeigen