Signal-Slot-Mechanismus

Signal-Slot-Mechanismus

Signale und Slots sind ein Konzept aus der Programmierung. Sie realisieren einen ereignisgesteuerten Programmfluss beziehungsweise eine ereignisgesteuerte Kommunikation zwischen Programmobjekten. Ursprünglich geprägt wurde der Begriff durch die Bibliothek Qt, wird aber mittlerweile auch von einer Reihe anderer Programmbibliotheken genutzt. Das Konzept lässt sich als spezielle Form des Beobachterprinzips betrachten und stellt eine Alternative zu den häufiger verwendeten Rückruffunktionen (engl. Callbacks) dar.

Das Signal-Slot-Konzept ist insbesondere in der Programmiersprache C++ verbreitet. Hier kann durch konzeptionell einfachere Rückrufmechanismen oftmals keine ausreichende Flexibilität erreicht werden, ohne dabei das Paradigma der starken Typsicherheit zu verletzen.

Inhaltsverzeichnis

Überblick

Signale 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 verknüpft werden kann. Slots und Signale „wissen“ zunächst nichts voneinander. Erst durch die Verknüpfung entsteht die eigentliche Programmlogik: Jedes Mal, wenn das Signal abgegeben wird, wird anschließend 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 häufig finden sich Signal-Slot-Mechanismen in Programmbibliotheken zur Erstellung grafischer Benutzeroberflächen. Hier erfüllen sie die Aufgabe, Objekte, insbesondere Widgets miteinander zu verknüpfen und so die Kontrollelemente der Oberfläche wie Schaltflächen und Listenfelder mit Funktionalität zu füllen.

Die C++-Bibliothek Qt ist wohl das bekannteste Beispiel für die Verwendung von Signalen und Slots. Realisiert werden sie dort durch neu in C++ eingeführte Schlüsselwörter wie signal, slot und emit, die, bevor sie durch den C++-Präprozessor 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.

Vor- und Nachteile

Signale und Slots sind bei Einhaltung der Typsicherheit einfacher und flexibler zu verwenden als Callbacks, allerdings geht dies wegen des Overheads geringfügig 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 für Callbacks beziehungsweise Methodenzeiger notwendige.

Beispiele mit Qt

Vordefinierte Signale und Slots

Bei Qt verfügen viele mitgelieferte Klassen bereits über diverse vordefinierte Signale und Slots, die man verwenden kann. Im folgenden Beispiel soll gezeigt werden, wie man diese benutzen kann, um Basisfunktionalitäten in ein GUI zu programmieren.

MainWindow::MainWindow(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{
	ui.setupUi(this);
 
	QWidget* w = new QWidget();
	QCheckBox* c = new QCheckBox("Fenster sichtbar", this);
 
	connect( c, SIGNAL( clicked(bool) ), w, SLOT( setVisible(bool) ) );
}

Zu sehen ist der Konstruktor des Hauptfensters. Die Zeile ui.setupUi(this); dient zur Generierung der Benutzeroberfläche und sei hier nicht näher erläutert (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.

Anschließend 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 übergeben. setVisible ist ein Slot, über den bei allen Widgets gesteuert werden kann, ob es sichtbar ist oder nicht. SIGNAL und SLOT sind Qt-eigene Schlüsselwörter, um Signale und Slots als solche zu kennzeichnen; sie werden vom Meta Object Compiler erkannt.

Nach dem Start des Programmes würde nun das zweite, leere Fenster bei jedem Klick auf die Checkbox jeweils erscheinen oder verschwinden.

Beispiel für selbsterstellte Signale und Slots

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 verändern oder auszulesen. Die Ergänzungen gegenüber einem Programm ohne Signale und Slots sind rot markiert:

// Zahl.h (Für den Meta Object Compiler(moc) muss die Datei mit dem neuen QObject die Endung *.h haben)

#include <QObject>

class Zahl : public QObject 
{
    Q_OBJECT

private:
    int wert;
   
public:
    Zahl() : wert(0)
    {
    }

    int wertLesen() const { return wert; }

public slots:
    void setzeWert(int wert)
    {
        if (wert != this->wert)
        {
            this->wert = wert;
            emit wertGeaendert(wert);
        }
    }
 
signals:
    void wertGeaendert(int neuerWert);
};
// main.cpp

#include <Zahl.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
}

Die Klasse Zahl wird aus der Klasse QObject abgeleitet, die die notwendigen Funktionen für die Verwendung von Signalen und Slots enthält. Q_OBJECT ist ein Makro, das in allen Klassen enthalten sein muss, in denen Signale oder Slots deklariert werden. Die Funktion setzeWert() ist als Slot deklariert, d. h. sie kann mit Signalen wie wertGeaendert() verbunden werden. Der Meta Object Compiler erzeugt aus dieser Deklaration der Klasse Zahl zusätzlichen Quellcode, der Funktionen zur Verwendung der neu deklarierten Signale und Slots enthält. Für die Signale müssen vom Programmierer keine Funktionen mehr implementiert werden.

Wenn Signale mit emit aktiviert werden, werden alle Slots, die während der Laufzeit des Programms mit diesem Signal verbunden wurden, aufgerufen. Diese Verbindung von Signalen und Slots geschieht mit connect() und kann auch wieder aufgehoben werden. In connect() wird auch geprüft, ob die angegebenen Signale und Slots existieren und ob die Typen der Parameter übereinstimmen. Die verbundenen Signale und Slots (jeweils die Instanz einer Klasse und eine Funktion) werden in einer Liste verwaltet. Einem Signal können beliebig viele Slots zugeordnet werden.

In dem Beispiel wird mit a.setzeWert(5); und b.setzeWert(48); der Wert der Instanzen a und b geändert. Da mit dem Signal wertGeaendert() beider Instanzen noch kein Slot verbunden ist, bewirkt die Aktivierung des Signals in setzeWert() nichts. Erst nach dem Verbinden mit connect() wird bei einer Änderung des Wertes von a auch der Wert von b geändert.

Weblinks


Wikimedia Foundation.

Игры ⚽ Поможем написать реферат

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Libsigc — libsigc++ Entwickler: Karl Nelson, Tero Pulkkinen Aktuelle Version: 2.0.18 (10. September 2007) …   Deutsch Wikipedia

  • Libsigc++ — Entwickler: Karl Nelson, Tero Pulkkinen Aktuelle Version: 2.0.18 (10. September 2007) …   Deutsch Wikipedia

  • libsigc++ — Aktuelle Version 2.2.4 (25. August 2009) Betriebssystem UNIX …   Deutsch Wikipedia

  • ClanLib — Aktuelle Version 2.3.3 (5. September 2011) Betriebssystem diverse Unix Derivate (Mac OS X, Linux, …) Microsoft Windows Programmier­sprache C++ Lizenz …   Deutsch Wikipedia

  • Clanlib — Aktuelle Version: 0.8.1 (12. März 2008) Betriebssystem: diverse Unix Derivate, Microsoft Windows, Mac OS X Lizenz: LGPL, Cla …   Deutsch Wikipedia

  • Observer (Entwurfsmuster) — Der Observer (Beobachter, Listener) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung und gehört zu der Kategorie der Verhaltensmuster (Behavioural Patterns). Es dient zur Weitergabe von Änderungen an einem Objekt an von diesem… …   Deutsch Wikipedia

  • Amiga-Computer — Letztes offizielles Logo Der Commodore Amiga (spanisch amiga: Freundin) war ein von Mitte der 1980er bis Anfang/Mitte der 1990er weit verbreiteter Computer, der besonders in seinen Einsteigermodellen (A500 und A1200) als Heimcomputer beliebt war …   Deutsch Wikipedia

  • Commodore Amiga — Letztes offizielles Logo Der Commodore Amiga (spanisch amiga: Freundin) war ein von Mitte der 1980er bis Anfang/Mitte der 1990er weit verbreiteter Computer, der besonders in seinen Einsteigermodellen (A500 und A1200) als Heimcomputer beliebt war …   Deutsch Wikipedia

  • HiToro Company — Letztes offizielles Logo Der Commodore Amiga (spanisch amiga: Freundin) war ein von Mitte der 1980er bis Anfang/Mitte der 1990er weit verbreiteter Computer, der besonders in seinen Einsteigermodellen (A500 und A1200) als Heimcomputer beliebt war …   Deutsch Wikipedia

  • CSMA-CD — Dieser Artikel wurde aufgrund von inhaltlichen Mängeln auf der Qualitätssicherungsseite der Redaktion Informatik eingetragen. Dies geschieht, um die Qualität der Artikel aus dem Themengebiet Informatik auf ein akzeptables Niveau zu bringen. Hilf… …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”