www.wikidata.de-de.nina.az
Signale und Slots sind ein Konzept aus der Programmierung Sie realisieren einen ereignisgesteuerten Programmfluss beziehungsweise eine ereignisgesteuerte Kommunikation zwischen Programmobjekten Ursprunglich gepragt wurde der Begriff durch die Bibliothek Qt wird aber mittlerweile auch von einer Reihe anderer Programmbibliotheken genutzt Das Konzept lasst sich als Anwendung des Entwurfsmusters Beobachter betrachten Es wird als Alternative zu direkten Ruckruffunktionen engl Callbacks eingesetzt wenn sich diese als zu unflexibel oder nicht typsicher erweisen z B bei der Entwicklung komplexer grafischer Anwendungen Inhaltsverzeichnis 1 Uberblick 2 Vorteile 3 Beispiele mit Qt 3 1 Vordefinierte Signale und Slots 3 2 Beispiel fur selbsterstellte Signale und Slots 4 Implementierungen 5 WeblinksUberblick BearbeitenSignale sind Botschaften die bei Eintreten eines Ereignisses abgegeben werden emittiert Ein Slot ist prinzipiell eine normale Funktion die auf eine bestimmte Weise mit einem Signal verknupft werden kann Slots und Signale wissen zunachst nichts voneinander Erst durch die Verknupfung entsteht die eigentliche Programmlogik Jedes Mal wenn das Signal abgegeben wird wird anschliessend der verbundene Slot aufgerufen Ein Signal kann auch mit mehreren Slots verbunden werden so dass bei Eintreten eines Ereignisses mehrere Funktionen aufgerufen werden Ebenso kann ein Slot mit mehreren Signalen verbunden werden wodurch dieselbe Funktion bei Auftreten unterschiedlicher Ereignisse aufgerufen wird Besonders haufig finden sich Signal Slot Mechanismen in Programmbibliotheken zur Erstellung grafischer Benutzeroberflachen Hier erfullen sie die Aufgabe Objekte insbesondere Steuerelemente miteinander zu verknupfen und so die Kontrollelemente der Oberflache wie Schaltflachen und Listenfelder mit Funktionalitat zu fullen Die C Bibliothek Qt ist wohl das bekannteste Beispiel fur die Verwendung von Signalen und Slots Realisiert werden sie dort durch neu in C eingefuhrte Schlusselworter wie signal slot und emit die bevor sie durch den C Praprozessor entfernt werden dem Qt eigenen Meta Object Compiler moc bei der Erstellung weiteren C Codes helfen Weiterhin gibt es verschiedene Programmbibliotheken welche Signal Slot Mechanismen mittels generischer Programmierung Templates und Funktoren realisieren wie die Bibliothek Boost oder libsigc eine Signal Slot Bibliothek welche beispielsweise von der gtkmm Bibliothek verwendet wird Vorteile BearbeitenSignale und Slots sind bei Einhaltung der Typsicherheit einfacher und flexibler zu verwenden als Callbacks allerdings geht dies wegen des Overheads geringfugig auf Kosten der Geschwindigkeit Der Unterschied ist jedoch in der Praxis kaum relevant Die Syntax von Signalen und Slots kann oftmals einfacher erscheinen als die fur Callbacks beziehungsweise Methodenzeiger notwendige Beispiele mit Qt BearbeitenVordefinierte Signale und Slots Bearbeiten Bei Qt verfugen viele mitgelieferte Klassen bereits uber diverse vordefinierte Signale und Slots die man verwenden kann Im folgenden Beispiel soll gezeigt werden wie man diese benutzen kann um Basisfunktionalitaten in ein GUI zu programmieren include lt QCheckBox gt include lt QObject gt include lt QMainWindow gt include lt QWidget gt include lt Qt gt class MainWindow QMainWindow private QWidget w QCheckBox c Fenster sichtbar this public MainWindow QWidget parent Qt WindowFlags flags QMainWindow parent flags ui setupUi this connect amp c SIGNAL clicked bool amp w SLOT setVisible bool Zu sehen ist der Konstruktor des Hauptfensters Die Zeile ui setupUi this dient zur Generierung der Benutzeroberflache und sei hier nicht naher erlautert siehe Qt Dokumentation Die folgenden zwei Zeilen dienen der Erstellung eines leeren Fenster Widgets w und eines mit dem Text Fenster sichtbar beschrifteten Checkbox Widgets c das im Hauptfenster erscheint Anschliessend wird mittels connect die Verbindung beider Objekte erreicht Als Signal dient das clicked Signal der Checkbox das dann abgegeben wird wenn der Benutzer die Box anklickt Der Status nach dem Anklicken also ob die Box angekreuzt ist oder nicht wird als boolescher Parameter mit ubergeben setVisible ist ein Slot uber den bei allen Widgets gesteuert werden kann ob es sichtbar ist oder nicht SIGNAL und SLOT sind Qt eigene Schlusselworter um Signale und Slots als solche zu kennzeichnen sie werden vom Meta Object Compiler erkannt Nach dem Start des Programmes wurde nun das zweite leere Fenster bei jedem Klick auf die Checkbox jeweils erscheinen oder verschwinden Beispiel fur selbsterstellte Signale und Slots Bearbeiten An einer einfachen Klasse wird gezeigt wie Signale und Slots in der Qt Bibliothek funktionieren Die Klasse Zahl speichert einen Wert und hat zwei Funktionen um diesen Wert zu verandern oder auszulesen Number h include lt QObject gt class Number QObject Q OBJECT private int value public Number value 0 int getValue const return value slots void setValue int value if value this gt value this gt value value emit onChange value signals void onChange int newValue main cpp include lt Number h gt include lt QObject gt int main void Number a b a getValue 0 b getValue 0 a setValue 5 a getValue 5 b getValue 0 b setValue 48 a getValue 5 b getValue 48 QObject connect amp a SIGNAL onChange int amp b SLOT setValue int a setValue 12 a getValue 12 b getValue 12 b setValue 23 a getValue 12 b getValue 23 Die Klasse Number wird aus der Klasse QObject abgeleitet die die notwendigen Funktionen fur die Verwendung von Signalen und Slots enthalt Q OBJECT ist ein Makro das in allen Klassen enthalten sein muss in denen Signale oder Slots deklariert werden Die Funktion setValue ist als Slot deklariert d h sie kann mit Signalen wie onChange verbunden werden Der Meta Object Compiler erzeugt aus dieser Deklaration der Klasse Number zusatzlichen Quellcode der Funktionen zur Verwendung der neu deklarierten Signale und Slots enthalt Fur die Signale mussen vom Programmierer keine Funktionen mehr implementiert werden Wenn Signale mit emit aktiviert werden werden alle Slots die wahrend der Laufzeit des Programms mit diesem Signal verbunden wurden aufgerufen Diese Verbindung von Signalen und Slots geschieht mit connect siehe zum besseren Verstandnis Weblinks Qt Dokumentation zu Signals und Slots und kann auch wieder aufgehoben werden In connect wird auch gepruft ob die angegebenen Signale und Slots existieren und ob die Typen der Parameter ubereinstimmen Die verbundenen Signale und Slots jeweils die Instanz einer Klasse und eine Funktion werden in einer Liste verwaltet Einem Signal konnen beliebig viele Slots zugeordnet werden In dem Beispiel erhalten die Instanzen a und b bei der Initialisierung den Wert 0 Mit a setValue 5 und b setValue 48 wird der Wert von a und b geandert und jeweils das Signal onChange aktiviert Da bei diesen ersten Aufrufen von setValue noch kein Slot mit den Signalen beider Instanzen verbunden ist bewirkt die Aktivierung des Signals nichts Erst nach dem Verbinden des Signals a onChange mit dem Slot b setValue mittels connect wird bei einer Anderung des Wertes von a auch die Funktion b setValue aufgerufen und damit der Wert von b geandert Der letzte Aufruf b setValue 23 hat keine Auswirkung auf a da mit dem Signal b onChange kein Slot verbunden ist Implementierungen Bearbeitendas Signals und Slots Modell von Qt einer C Klassenbibliothek zur plattformubergreifenden Oberflachenprogrammierung C Boost Signals2 bzw Boost Signals veraltet C libsigc Template basiert C sigslot C XLObject Template basiert Qt orientiert C Signals C libevent multi threaded plattformubergreifend C libev minimalistische Alternative zu libevent JavaScript EventTargetProvider js Sprachkern basiert typsicher PHP TYPO3 Flow application framework mit Signal Slot Unterstutzung Java sig4j multi threaded typsicher basiert auf der in Java 8 eingefuhrten FunctionalInterface Annotation Weblinks BearbeitenQt Dokumentation zu Signals und Slots engl boost signals bzw Boost Signals2 engl A Deeper Look at Signals and Slots Memento vom 3 Juli 2007 im Internet Archive engl Abgerufen von https de wikipedia org w index php title Signal Slot Konzept amp oldid 234688927