© 2008 TravelTainment The Amadeus Leisure Group Thread-Programmierung im Qt-Framework Von: Simon Lubberich Erstbetreuer: Prof. Dr. rer. nat. Bodo Kraft Zweitbetreuer: Dipl.-Math. (FH) Uli Schmidt
© 2008 TravelTainment The Amadeus Leisure Group 2 Thread-Programmierung im Qt-Framework Inhalt: Was ist ein Thread Wofür werden Threads benutzt Probleme, die Threads mit sich bringen Das Qt-Framework Die Qt-Basisklasse QObject Die Klassenhierarchie Speicherverwaltung Die Klasse QThread Synchronisation Kommunikation Model-View-Architektur in Qt Fazit
© 2008 TravelTainment The Amadeus Leisure Group Thread-Programmierung im Qt-Framework Ausführungsstrang Teilt Speicherbereich Vier Zustände inaktiv rechenbereit blockiert laufend Echt- oder pseudo- parallele Ausführung Erzeugt Verwaltungs- Over-Head 3 Was ist ein Thread: Prozess GUI-Thread Stack Thread2 Stack Heap Zugriff
© 2008 TravelTainment The Amadeus Leisure Group Thread-Programmierung im Qt-Framework Zwei Klassen Speicherzugriff Warten auf anderen Thread 4 Probleme, die Threads mit sich bringen: Rechenintensive und parallelisierbare Probleme GUI-Entwicklung Wofür werden Threads benutzt:
© 2008 TravelTainment The Amadeus Leisure Group Thread-Programmierung im Qt-Framework Klasse 2: warten auf Thread Anhalten von Threads Verklemmung 5 Probleme Deadlock: Klasse 1: Speicherzugriff Abhängig von einzelnen Operationen Problem Race Condition:
© 2008 TravelTainment The Amadeus Leisure Group Thread-Programmierung im Qt-Framework 6 Das Qt-Framework: Framework zur GUI-Entwicklung Zusätzlich Nicht-GUI-Klassen z.B. Netzwerkklassen Keine zusätzlichen Bibliotheken erforderlich Die Qt-Basisklasse QObject: Automatische Speicherverwaltung Signal-Slot-Konzept
© 2008 TravelTainment The Amadeus Leisure Group Thread-Programmierung im Qt-Framework 7 Die Klassenhierarchie: Klassen von Basisklassen abgeleitet Mehrfachvererbung
© 2008 TravelTainment The Amadeus Leisure Group Thread-Programmierung im Qt-Framework 8 Speicherverwaltung: Automatische Speicherverwaltung durch QObject Klassenhierarchie Baumstruktur an Eltern-Kind-Beziehungen Objekt löscht Nachkommen
© 2008 TravelTainment The Amadeus Leisure Group Thread-Programmierung im Qt-Framework 9 Die Klasse QThread: repräsentiert Threads Erleichtert Umgang QThreads verwenden Heap gemeinsam -> Synchronisation Erstellen eigener QThreads:
© 2008 TravelTainment The Amadeus Leisure Group Thread-Programmierung im Qt-Framework 10 Qt-Klassen in QThreads verwenden: Thread nicht als Eltern-Objekt angeben Keine automatische Speicherverwaltung Objekte explizit löschen Synchronisation: Kritischer Abschnitt: Bereich mit globalen Variablen Zugriffsynchronisation kritischer Abschnitte Daten-Konsistenz sicherstellen
© 2008 TravelTainment The Amadeus Leisure Group Thread-Programmierung im Qt-Framework 11 Synchronisation durch QMutex: Die Hilfsklasse QMutexLocker: Umschließt kritischen Bereich lock() -> sperrt kritischen Abschnitt unlock() -> hebt Sperre auf Konstruktor erhält QMutex-Objekt Konstruktor -> sperrt kritischen Abschnitt Destruktor -> hebt Sperre auf Synchronisation durch QSemaphor: Konstruktor erhält Anzahl Ressourcen acquire( ) -> dekrementiert evtl. Blockierung release( ) -> inkrementiert
© 2008 TravelTainment The Amadeus Leisure Group Thread-Programmierung im Qt-Framework 12 Synchronisation durch QReadWriteLock: Synchronisiert Lese- u. Schreibzugriff lockForRead() -> sperrt Schreibzugriff lockForWrite() -> sperrt Lese- u. Schreibzugriff unlock() -> hebt letzte Sperre auf Synchronisation durch QWaitCondition: Primitive Kommunikation wait() -> blockiert Thread Argument: gesperrtes QMutex-Objekt wakeOne() -> reaktiviert einen Thread wakeAll() -> reaktiviert alle Threads
© 2008 TravelTainment The Amadeus Leisure Group Thread-Programmierung im Qt-Framework 13 Kommunikation: Signal-Slot-Konzept QObject-Nachkommen Makro Q_OBJECT setzen Signals & Slots explizit kennzeichnen Argumentlisten identisch oder Slot besitzt weniger Argumente
© 2008 TravelTainment The Amadeus Leisure Group Thread-Programmierung im Qt-Framework 14 Kommunikation zwischen QThreads: Gemeinsame Variablen Synchronisationsmechanismen Signal-Slot-Konzept Kommunikation mit Hauptthread: Darf nur GUI updaten Nur Signal-Slot-Konzept geeignet Verbindung zu Objekten des Hauptthreads
© 2008 TravelTainment The Amadeus Leisure Group Thread-Programmierung im Qt-Framework 15 Model-View-Architektur: Das Delegate-Objekt: Element der View Ändert Model über View Definiert genau Anzeige Wichtige Methoden: createEditor(), setEditorData(), setModelData() und paint() Model View1 View2 Delegate1Delegate2 Rendering Editing
© 2008 TravelTainment The Amadeus Leisure Group Thread-Programmierung im Qt-Framework 16 Model-View-Architektur:
© 2008 TravelTainment The Amadeus Leisure Group Thread-Programmierung im Qt-Framework 17 Fazit: Positiv: Sehr mächtiges Framework Leicht verständliche Kommunikationsmechanismen Bietet viel Funktionalität Plattformunabhängig Sehr gut dokumentiert Negativ: Großer Aufwand beim Anlegen von Klassen Ungeeignet für Verarbeitung großer Datenmengen z.B. QString Programm benötigt immer Bibliotheken von Qt
© 2008 TravelTainment The Amadeus Leisure Group 18 Vielen Dank
© 2008 TravelTainment The Amadeus Leisure Group 19 Model View1 View2 Delegate1Delegate2 Rendering Editing