Signal-Slot-Konzept

Signale und Slots Sind ein Konzept aus der Programmierung . Sie EINEN Realisiert ereignisgesteuerten Programmfluss Beziehungsweise Eine ereignisgesteuerte Kommunikation between Programmobjekten . Ursprünglich geprägt Würde der Begriff Durch Die Bibliothek Qt , Wird aber mittlerweile auch von Einer Reihe Anderer Programmbibliotheken genutzt. Sie können als eine Anwendung des Entwurfsmusters Beobachter lesen . Es wird als Alternative fliegen Rückruffunktionen (engl. Callbacks ) eingesetzt, WENN du this als oder nicht zu unflexibel typsicher(z. B. bei der Entwicklung komplexer grafischer Anwendungen ).

Überblick

Signal Mind „Botschaften“, die von den Eintreten eines Ereignisses aufgegeben wurden . Ein Slot ist prinzipiell eine normale Funktion , die ein gutes Beispiel für ein Signal ist, wurde erkannt. Slots und Signal „löschen“ zunächt nichts voneinander. Ernst durch die Verknüpfung definiert die eigene Programmlogik: Jedes Mal, wenn das Signal abgewartet wird, wird der geschlossene Slot aktiviert. An diese Steckplätze kann ein Signal angeschlossen werden, so dass beim Eintreten eines Ereignisses mehrere laufen. Ebensogut kann ein Slot mit mehreren Zeichen versehen werden, wodurch die Funktion aktiviert wird.

Besonders hilfreich findet Signal-Slot-Mechanismen in Programmbibliotheken , sowie grafische Benutzeroberflächen . Hier erfüllen sie sterben Aufgabe, Objekte , insbesondere Steuerelemente Mannheimer zu verknüpfen und so Kontrollelemente der OBERFLÄCHE Wie die Schaltflächen und Listenfelder mit Funktionalität zu voll.

Die C ++ -Bibliothek Qt ist wohl das bekannteste beispiel für sterben verwendung von signalen und Slots. Realisiert Werden sie dort Durch neu in C ++ eingeführte Schlüsselwörter Wie Signal , Schlitz und Emitter , die, Bevor sie Durch die C ++ – Präprozessor Entfernt Werden solche Qt eigenen „Meta Object Compiler“ ( MOC ) bei der Erstellung weitere C ++ – Codes helfen.

Weiterhin war also verschiedene Programmbibliotheken, WELCHES Signal Slot – Mechanismus Profilierung mittels Generischer Programmierung ( Templates ) und Funktors Realisiert, Wie Bibliothek stirbt Boost – oder libsigc ++ , Ein Signal – Slot-Bibliothek, Welche beispielsweise von der gtkmm -Bibliothek used Wird.

Vorteile

Signale und Slots Sind bei einhaltung wo Typsicherheit Einfacher und flexi Einrichtung zu Verwenden als Rückrufe , stirbt allerdings geht wegen des Gemeinkosten geringfügig auf Kosten der geschwindigkeit. Der Unterschied ist in der Praxis kaum relevant.

Die Syntax von signalen und Slots Kann oftmals Einfacher Erscheinen als für Rückrufe Beziehungsweise sterben Methodenzeiger Notwendig.

Beispiele mit Qt

Vordefinierte Signale und Slots

Bei Qt bieten viele mitgelieferte Klassen verschiedene vordefinierte Signale und Slots an, mit denen sich Menschen auseinandersetzen können. Ich suche nach Beispiel soll, wer diese Grundfunktionen in einem GUI- Programm zu nutzen weiß .

MainWindow :: MainWindow ( QWidget * Eltern , Qt :: WFlags Flags )
: QMainWindow ( Eltern , Flags )
{
Ui . setupUi ( dies );
QWidget * w = neues QWidget ();
QCheckBox * c = neue QCheckBox ( "Fenster sichtbar" , this );
verbinden ( c , SIGNAL ( clicked ( bool ) ), w , SLOT ( setVisible ( bool ) ) );
}

Hier ist der Konstruktor des Hauptfensters. Die ui.setupUi(this);Zeil dient der Generierung der Benutzeroberfläche und damit nicht näher erklärt (siehe Qt-Dokumentation). Die folgenden zwei Zeilen erstellen eine Fenster-Widgets wund ein mit dem Text „Fenster sichtbar“ Beschreibungen Checkbox- Widgets c, das im Hauptfenster erscheint.

Wird connectdie Verbindung beider Objekte erreicht. Wenn Signal clickedSignalton erfordert, werden Sie aufgefordert, auf die Box zuzugreifen. There Status Fast Anklicken, Auch Ob That Box ist kein Nö, Als Boolescher Parameter mit übergeben. setVisibleist ein Slot, über den alle Widgets gesteuert werden können, ob dies möglich ist oder nicht. SIGNALund SLOTSind Qt-eigene Schlüsselwörter, um Zeichen und Slots auch zu kennzeichnen; sie werden vom Meta-Object – Compiler Erkannt.

Nach dem Start des Programms werden Sie nicht mehr herausfinden können.Klicken Sie auf das Kontrollkästchen, um mehr zu erfahren.

Beispiel für selbsterstellte Signale und Slots

An einem einfachen Klassiker wird ersichtlich, wer Signale und Slots in den Qt-Libraries betreibt. ZahlDiese Klasse enthält einen Wert und hat zwei Funktionen, um diesen Wert zu ändern oder auszulesen:

// Anzahl.h
#include <QObject>
Klasse Zahl : public QObject
{
 Q_OBJECT
private :
 int wert ;
public :
 Zahl () : Wert ( 0 )
 {
 }
 int wertLesen () const { zurückkehren Wert ; }
öffentliche Slots :
 void setzeWert ( int wert )
 {
 if ( wert ! = dies -> wert )
 {
 this ->wert = wert ;
 emittieren wertGeaendert ( Wert );
 }
 }
Signale :
 void wertGeaendert ( int neuerWert );
};
// main.cpp
#include <Anzahl.h>
int main ( void )
{
 Zahl a , b ; // a.wertLesen () == 0, b.wertLesen () == 0
 a . SetzeWert ( 5 ); // a.wertLesen () == 5, b.wertLesen () == 0
 b . SetzeWert ( 48 ); // a.wertLesen () == 5, b.wertLesen () == 48
 QObject :: connect ( & a , SIGNAL ( wertGeaendert ( int ) ), & b , SLOT ( setzeWert ( int ) ) );
 a . SetzeWert ( 12 ); // a.wertLesen () == 12, b.wertLesen () == 12
 b . SetzeWert ( 23 ); // a.wertLesen () == 12, b.wertLesen () == 23
}

De Klasse Zahlwird aus der Klasse QObjectherausgeleitet, die Funktionen für die Nutzung von Signaturen und Slots enthalten. Q_OBJECTIst ein Makro, das in allen Klassen enthalten sein, in den folgenden Signale oder Slots deklariert werden. setzeWert()Diese Funktion wird als Final, d.h, deklariert, wertGeaendert()was Signale sein können, die verbunden waren. Der Meta-Object-Compiler ist auch aus dieser Erklärung der ZahlQuellcode, der Funktionen zur Nutzung der neuen Deklaranten und Slots enthält. Für die Signale müssen vom Programmierer keine Funktionen mehr implementiert werden.

Wenn Signale emitaktiviert wurde, wurden alle Slots, die mit dem Programm verbunden waren, mit dem Signal Wurden, aufgerufen. Diese Verbindung von Signalen und Slots wurde erstellt connect()(siehe Weblinks : Qt-Dokumentation zu Signals und Slots) und Sie können möglicherweise auch hinzufügen. In connect()Auch können Sie Signal und Slots für jede Art von Parametereinstellung finden. Die verbundenen Signale und Slots wurden in einer Liste gewarnt. Ein Signal könnte sehr gut werden.

In ihnen beispiel erhält Instanz sterben aund bbei der Initialisierung des Wert 0. Mit a.setzeWert(5);und b.setzeWert(48);Wird der Wert von aund bGeändert und das Signal Jeweils wertGeaendert()aktiviert Bitte. Dann besteht keine Notwendigkeit für eine klare Schlussfolgerung setzeWert()mit dem Signal, aber die Instans sind verbunden, sie aktivieren die Aktivierung der Signale. Erst nach DEM Verbindet des Signals a.wertGeaendert()with the Slot Profilierung b.setzeWert()mittels connect()Wurde bei Einer Änderung des Wert von aAuch sterben Funktion b.setzeWert()aufgerufen und DAMIT den Wert von bGeändert. Da haben Sie eine große b.setzeWert(23)Auswahl a, da sie b.wertGeaendert()kein Signal Slot angeschlossen sind.

Implementierungseinheit

  • das Signal und Slots – Modell von Qt , einer C ++ – Klassenbibliothek (zur plattformübergreifenden Oberflächenprogrammierung)
  • C ++: Boost.Signale2 bzw. Boost.Signale (veraltet)
  • C ++: libsigc ++ – Template-basiert.
  • C ++: Siglock
  • C ++: XLObject – Template-Basiert, Qt-orientiert.
  • C ++: Signale
  • C: Libevent – Multi-threaded, plattformübergreifend.
  • C: libev – minimalistic Alternative zu libevent.
  • JavaScript: EventTargetProvider.js , Sprachkern-basiert, typsicher.
  • PHP: TYPO3 Flow – Anwendungs-Framework mit Signal-Lock-Unterstützung
  • Java: sig4j – multi-threaded, typsicher, basierend auf Java 8 eingeführten FunctionalInterface Annotation.