Frage

Kann jemand erklären in einfachen Worten die "Signale und Slots" Muster?

War es hilfreich?

Lösung

Signale und Schlitze sind ein Weg, um einen Absender der Entkopplung (das Signal) und null oder mehr Empfänger (die Schlitze). Angenommen, Sie haben ein System, das Ereignis, die Sie machen wollen, die einen anderen Teil des Systems interessiert an diesen Ereignissen hat. Anstatt hart Verdrahtung den Code, das Ereignis an den Code generiert, über diese Ereignisse wissen will, würden Sie eine Signal und Slots Muster verwenden.

Wenn der Sender ein Ereignis signalisiert (in der Regel durch die Funktion mit diesem Ereignis / Signal zugeordnet Aufruf) alle Empfänger für dieses Ereignis werden automatisch aufgerufen. Auf diese Weise können Sie Empfänger nach Bedarf während der Laufzeit des Programms verbinden und trennen.

Da diese Frage wurde C ++ markiert, hier ist ein Link auf die Boost.Signals Bibliothek, die eine wesentlich gründlichere Erklärung hat.

Andere Tipps

Ich denke, ein Signale und Slots am besten beschreiben können, wenn man sie als eine mögliche Implementierung Fahrzeug für die Observer-Muster oder Publish / Subscriber-Muster . Es gibt eine signal, zum Beispiel buttonPressed(IdType) auf der Publisher-Seite. Jedes Mal, wenn die Taste gedrückt wird, werden alle Slots, die auf dieses Signal verbunden sind, genannt. Slots sind auf der Teilnehmerseite. Ein Schlitz könnte zum Beispiel sendMail(IdType) werden.

Zusammen mit dem Ereignis „Taste gedrückt“, der Schlitz würde wissen, welche Taste gedrückt wurde, da die ID übergeben worden wäre. IdType repräsentiert den Typ der Daten, die über die Verbindung zwischen dem Verleger und dem Teilnehmer gesendet. Eine Operation möglich, dass die Subscriber connect(signal, slot) würde die buttonPressed(IdType) mit sendMail(IdType) verbinden könnte, so dass, wenn die Taste gedrückt wird, dass bestimmte Schlitz genannt wird.

Die gute daran ist, dass die Teilnehmer (die Schlitzseite) muss sich nicht um Details des Signals sorgen. Es muss nur angeschlossen werden. So haben wir hier sehr viel lose Kopplung . Sie können die Tasten Implementierung ändern, aber die Schnittstelle für die Schlitze würde immer noch die gleiche sein.

Schauen Sie sich Qt Signale / Slots oder Boost-Signale für weitere Informationen.

Stellen Sie sich eine GUI in Ihrer Anwendung haben. Die meiste Zeit, Steuerfluss nicht sehr linear, das heißt, anstatt eine klare Abfolge von Aktionen, die Sie würden es einen Benutzer, die mit der GUI (wie Schaltflächen, Menüs etc.) In Wechselwirkung tritt.

Dies ist im Wesentlichen ein ereignisgesteuertes Modell, das ganz gut mit den Signalen und Slots Mustern realisiert werden kann. Signale sind Ereignisse, die durch Objekte erzeugt werden (man denke GUI-Komponenten) und Schlitze für die Empfänger dieser Ereignisse sind.

Hier ist ein Beispiel: Stellen Sie eine Checkbox haben, als ein Objekt in Ihrer Programmiersprache dargestellt. Mehrere Dinge können auf diese Checkbox passieren: es umgeschaltet werden kann, was auch wiederum bedeutet, dass sie entweder ist scharf oder unscharf geschaltet. Das sind die Signale, die sie aussenden kann. Wir werden sie checkboxToggled, checkboxSet und checkboxUnset nennen. Wie Sie in diesem Beispiel sehen, wird das Kontrollkästchen immer das checkboxToggled Signal aussenden, wenn sie umgeschaltet, sondern auch genau eine der beiden anderen Signale, je nachdem, wie sich der Zustand ändert.

Nun stellen einige andere Objekte, nämlich ein Etikett, das aus Gründen der diesem Beispiel immer als Objekt existiert, aber kann „erscheinen“ und „verschwinden“ und ein System Signalton (auch durch ein Objekt dargestellt), die können einfach Signalton. Das sind die Schlitze diese Objekte haben. Wir nennen sie "messageAppear", "messageDisappear" und "Piep".

Angenommen, Sie das System Beep wollen jedes Mal piepen die Checkbox umgeschaltet werden, und das Etikett je nach erscheinen oder verschwinden, ob der Benutzer überprüft oder das Kontrollkästchen gelöscht.

Sie würden die folgenden Signale an die folgenden Steckplätze (Signale auf der linken Seite, Slots auf der rechten Seite) so verbinden:

checkboxToggled -> beep
checkboxSet -> messageAppear
checkboxUnset -> messageDisappear

Das ist im Grunde ist es.

Signale und Slots können auch Argumente haben. Um beispielsweise einen Schieber, der zu einem numerischen Wert setzt, möchten Sie den geänderten Wert zusammen mit dem ausgesandten Signal senden, sobald der Benutzer den Schieberegler bewegt. SliderChanged (int)

Natürlich tun wirklich etwas Nützliches Sie würde einige eigene Klassen schreiben, die einige eigene Signale und Slots enthalten würde. Das ist ganz leicht getan und unter Verwendung dieser eigenen Signale und Slots, Sie eine schöne Möglichkeit haben, mit den GUI oder anderen Teilen des Codes in einer ereignisgesteuerten Art und Weise zu interagieren.

Beachten Sie, dass Signale und Slots oft in dem Sinne symmetrisch sind, dass es oft ein Signal entsprechend einem Schlitz sein kann. Zum Beispiel kann ein Kontrollkästchen, ein Signal auszusenden, wenn umgeschaltet, aber es kann auch einen Schlitz enthalten, der das Ankreuzfeld selbst umschaltet. Es wäre leicht zu trennen Kontrollkästchen zu implementieren, die immer gesetzt sind miteinander entgegengesetzt.

Ich nehme an, Sie über Qt-Signale und Slots sprechen.
Es ist sehr einfach.

Eine Instanz einer Klasse kann ein Signal ausgelöst und eine andere Instanz vielleicht kann eine andere Klasse, dass das Signal in einem Schlitz fangen. Es ist eine Art wie ein Funktionsaufruf nur, dass der Mann, der die Funktion aufruft, nicht zu wissen braucht, der den Anruf empfangen möchte.

Die beste Art und Weise zu veranschaulichen, ist mit einem Beispiel.
Die Klasse QPushButton hat ein Signal QPushButton :: clicked (). Dieses Signal wird ausgelöst, wenn die Schaltfläche geklickt wird. Der Druckknopf muss nicht wissen, wer interessiert ist, zu wissen, dass ein Klick aufgetreten. es löst nur das Signal und wer interessiert ist kann sich mit ihm verbinden.
Die QDialog, in dem die Taste platziert in ist infact interessiert zu wissen, wenn die Schaltfläche geklickt wurde. Es hat den Schlitz MyDialog :: ButtonClicked (). Auf MyDialog c'tor müssen Sie connect () die Tasten klicken () Signal an die ButtonClicked des dialog () Slot, so dass der Schlitz aufgerufen wird, wenn das Signal ausgelöst wird.

Ein Bündel von fortgeschrittenere Sachen:

  • Argumente kann ein Signal Argumente haben und diese Argumente optional auch an den Schlitz übergeben werden kann.
  • Querfaden Anrufe - Wenn Sie machen ein Signal-Schlitz-Verbindung, die Cross-Thread sein muss, dann wird QT automatisch die Signale puffern und sie an der richtigen Thread Warteschlange. Dies geschieht automatisch, zum Beispiel, wenn ein GUI-Thread muss einen Arbeits Thread kommunizieren.

Hier weitere Informationen in QT-Dokumentation.

Das beste Beispiel und Erklärung, die ich für Signale und Slots gefunden haben, ist dieser Code Projekt Artikel .

Es gibt ein weit verbreitetes Missverständnis ist, dass Klassen sind Substantive wie Person, Hund, Fahrrad und so weiter. Dann macht es Sinn, zu glauben, dass eine Person (Instanz) hat einen Hund und ein Fahrrad.

Lassen Sie uns mit dem, was anfangen Objekte (sein soll). Objekte sind Daten und Verfahren. Welche Programme? Daten und Verfahren. Die Objekte werden soll (relativ) sein „kleine“ unabhängige Unterprogramme. Da oo Programmierung sehr vage gelehrt und missbraucht (Zitat benötigt), denken die Leute alles, was eine Klasse oder ein Objekt sein muss. Dies ist nicht so, Objekte „kleine“ unabhängige Programme mit einem „kleinen“ API (öffentlichen Subroutinen) sind. Einige Programmierer nicht einmal brechen ihr Projekt in Teilprogramme und einfach Objekte verwenden, in denen Daten und Verfahren besser geeignet sind.

Unter der Annahme, dass wir uns einig sind, dass Objekte sind Programme, wir, dass die Fälle in den meisten zustimmen können, Programme brauchen keine Kopien anderer Programme eine ähnliche Größe zu haben und Komplexität (dh ein Objekt keinen Zeiger auf ein anderes Objekt ) kann es kleinere Programme benötigt für die Verwaltung von Daten (wie Datenstrukturen), aber imho muss nicht ein anderes Objekt.

Warum? Da Kopplung Objekte macht sie abhängig. Warum ist das so schlimm? Denn wenn Objekte unabhängig sind, können Sie sie testen und versprechen auch andere Programmierer und Kunden, dass das Objekt (ein kleines, unabhängiges Programm) zur Durchführung bestimmter Aufgaben mit hoher Sicherheit kann. Sie können auch sicher sein, dass es so lange noch hält, da keine Änderungen an diesem Objekt vorgenommen wurden.

Also, was sind Slots und Signale? Wenn Sie verstehen, dass Objekte wie Programme sind, und sie sollten nicht in idealer Weise kopiert oder Zeiger auf andere Objekte halten, als Sie eine Möglichkeit für sie müssen zu kommunizieren. Zum Beispiel Prozesse, die auf Ihrem Computer ausgeführt werden können Steckdosen, IP-Adressen und Ports für die Kommunikation verwenden. Objekte können etwas sehr ähnlich RPC genannt Signale und Slots. Es handelt sich um eine Datenstruktur soll als Vermittler zwischen zwei größeren Objekten, die Objekt speichern die Subroutinen (slots) und lassen Sie andere Objekte nennen (signal) diese subrutines (slots) mit geeigneten Parametern, ohne etwas zu wissen, über diese anderen Objekte außer welchen Parametern sie erforderlich ist.

So ist die zugrunde liegende Struktur sind Sätze (möglicherweise Arrays) von (möglicherweise) stark typisierte Prozedurzeigern, dass andere Objekte mit geeigneten Parametern ohne Zeiger auf diese Objekte aufruf können. Die Anrufer nur Zugriff auf das Signal-Objekt benötigen statt (die keine Implementierungsdetails hält), dass die erwarteten Parameter definiert.

Dies ist auch flexibel, da es einige spezielle Anwendungsfälle wie Slots ermöglicht, die nur einmal auf das Signal reagieren, mehrere Slots für ein Signal und andere ähnliche Anwendungsfälle wie Entprellung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top