Publish Subscriber Design Pattern

Aufbau und Planung von Softwareprojekten, UML, Zustandsautomaten, Softwaremodule, OOP
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Publish Subscriber Design Pattern

Сообщение Eugen Graf »

Dies ist meine Realisierung des thementabellenbasierten Programmiermusters Publish Subscriber

http://de.wikipedia.org/wiki/Alert-Dienst
http://de.wikipedia.org/wiki/Observer_% ... smuster%29

Der Dispatcher ist das HauptVI dieses Programms. Seine Aufgabe ist es die Tabelle mit Topics (Kanäle) zu führen und ankommende Nachrichten an die Interessenten zu verteilen.

Zur Zeit werden vier wichtigsten Datenübertragungsmechanismen zwischen und innerhalb von Applikationen ünterstützt:

Queues
Notifiers
User Events
TCP/IP

Wenn Sie also mehrere parallellaufende Programmodule haben oder gar zwischen zwei oder mehreren Applikationen kommunizieren Möchten ist dieses Programmiermuster sicherlich interessant für Sie.

Anwendungen dafür wären zum Beispiel Chatsysteme oder ein Programm mit vielen dynamisch angeschlossenen Teilnehmern.

Sobald ein Teilnehmer sich beim Dispatcher anmeldet gibt er seine Referenz (diese wird vom Dispatcher in die Tabelle abgespeichert) und sagt welche Themen (Kanäle) er empfangen von anderen Teilnehmern möchte. Wenn also eine Nachricht von einem Teilnehmer an den Dispatcher geschickt wird, schaut der Dispatcher zunächst in der Tabelle nach welche Teilnehmer diese Nachricht empfangen möchten und schickt diese nacheinander zu den Teilnehmern ab. Wenn ein Teilnehmer nicht mehr erreichbar ist (Timeout beim Senden) oder ein Teilnehmer sich abmeldet, wird dieser vom Dispatcher aus der Tabelle entfernt.

Die Vorteile dieses Programmiermusters sind also:
Modularität
Keine unnötige Datenschieberei
Dynamik
Möglichkeit für Remote Debugging und verteilte Anwendungen
und viel mehr...


Download
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Publish Subscriber Design Pattern

Сообщение Eugen Graf »

Ich fange jetzt an dieses Pattern auf OOP Basis umzuprogrammieren. Interessierte Leute dürfen sich melden. :crazy:
montanaro
user
user
Сообщения: 81
Зарегистрирован: 01 сен 2008, 19:14
Версия LabVIEW: 8.6, 2009
Откуда: Südtirol-Italien
Контактная информация:

Re: Publish Subscriber Design Pattern

Сообщение montanaro »

Hallo eg,
ich hatte nun endlich ein wenig Zeit und habe mir deine Lösung zum zigten Mal "durchgekaut". Einiges geht über meine Kenntnisse hinaus. Trotzdem finde ich deine Arbeit sehr interessant. Habe die TCP/IP Lösung nachgebaut und 3 Clients eingesetzt. Es funktioniert einwandfrei. Werden die Werte auf einem Client verändert, so erhalten alle interessierten Clients die Änderungen.
Ich habe versucht die Ereignisschleife subscrive Daten so aufzubauen, dass beim Start eines Clients zuerst die Anmeldung am Dispatcher erfolgt (subscrive Client)und danach sofort dem Dispatcher mitgeteilt wird, welche Daten für diesen Client zur Verfügung gestellt werden sollen (subscrive Daten). Es entfällt somit das Anklicken dieses Subcrive Daten Buttons.Leider bekomme ich das nicht hin. Kannst du mir bitte einen Lösungsansatz geben. Danke und alles Gute
montanaro
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Publish Subscriber Design Pattern

Сообщение Eugen Graf »

Du kannst den Inhalt des Subscribe-Events vor der Hauptschleife ausführen. Sollte doch gehen, oder?
montanaro
user
user
Сообщения: 81
Зарегистрирован: 01 сен 2008, 19:14
Версия LabVIEW: 8.6, 2009
Откуда: Südtirol-Italien
Контактная информация:

Re: Publish Subscriber Design Pattern

Сообщение montanaro »

Hallo eg,
danke für die schnelle Antwort. Ich habe nun den Befehl vor die Hauptschleife gesetzt, jedoch bekommt der Dispatcher nicht die richtige Referenz. Er trägt mir immer eine 0 ein.
Hier mein Versuch. Wie bekomme ich die richtige Referenz?
Danke
montanaro
Вложения
TCP_IP_Test.png
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Publish Subscriber Design Pattern

Сообщение Eugen Graf »

Du musst ja die TCP-Referenz in den Cluster bundeln und abschicken. Zur Zeit schickst du ja nen Cluster aus vier Elementen ab:
1. Befehl - subscribe
2. leeren String (ich glaube an dieser Stelle soll die Referenz sein)
3. Array mit Topics - daten1...
4. Typ des Clients - TCP
montanaro
user
user
Сообщения: 81
Зарегистрирован: 01 сен 2008, 19:14
Версия LabVIEW: 8.6, 2009
Откуда: Südtirol-Italien
Контактная информация:

Re: Publish Subscriber Design Pattern

Сообщение montanaro »

Hallo eg,

vielen Danke für deine schnelle Hilfe. Es scheint jetzt zu funktionieren.
Gruß
montanaro
Вложения
TCP_IP_Test_2.png
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Publish Subscriber Design Pattern

Сообщение Eugen Graf »

Lokale Variable ist keine gute Wahl. Versuche gar keine Variablen in deinen Programmen zu benutzen, denn -
es kann passieren, dass du in den Control "String" noch keinen Wert reingeschrieben hast, willst aber diesen Wert über die lokale Variable "String" auszulesen und abzuschicken. Da muss man irgendwie sicherstellen, dass in dem Control "String" unbedingt etwas drinsteht, bevor du dich beim Dispatcher anmeldest.
Wenn der Dispatcher etwas länger braucht die TCP-Referenz zu erzeugen und zurück zum Client abzuschicken (und das macht er ja, wenn du die Verbindung öffnest), dann kommt das Ereignis "ClientRn" etwas später. Du willst aber sofort "Subscribe" machen. Also hier muss man auf sogenennte Race Conditions aufpassen ( /viewtopic.php?f=13&t=329 ).

Ich würde vorschlagen du machst aus dem Stück Code links oben ein SubVI (damit es weniger Platz braucht) und setzt dieses SubVI direkt in den Case "ClientRn" (dort, wo du den String beschreibst). Dann wird es kompakter aussehen und keine Race Conditions haben.

Gruß, eg
montanaro
user
user
Сообщения: 81
Зарегистрирован: 01 сен 2008, 19:14
Версия LabVIEW: 8.6, 2009
Откуда: Südtirol-Italien
Контактная информация:

Re: Publish Subscriber Design Pattern

Сообщение montanaro »

Hallo eg,

ich hatte schon gehofft, meine Lösung würde dir nicht gefallen. Zu viel war durcheinander. Jetzt endlich hatte ich Zeit deinen letzten Lösungsanstoß zu erarbeiten.
Sieht besser aus oder?
Grüße
montanaro
Вложения
Subscrive_Data_test_subVi_BD.png
Subscrive_Data_test_subVi_BD.png (7.33 КБ) 12476 просмотров
Subscrive_Data_test.png
montanaro
user
user
Сообщения: 81
Зарегистрирован: 01 сен 2008, 19:14
Версия LabVIEW: 8.6, 2009
Откуда: Südtirol-Italien
Контактная информация:

Re: Publish Subscriber Design Pattern

Сообщение montanaro »

Hallo eg,
das sub Vi gefällt mir noch nicht so recht. Ist so wie ich das gemacht habe doch auf daten1 begrenzt. Wäre es deshalb nicht besser, den array of string als weiteren Eingang hinzuzufügen?
Also ich meine das so.
Grüße
montanaro
Вложения
Subscrive_Data_test1.png
Subscrive_Data_test_subVi_BD1.png
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Publish Subscriber Design Pattern

Сообщение Eugen Graf »

Ja,ich habe es auch so gemeint. Funktioniert es so?
montanaro
user
user
Сообщения: 81
Зарегистрирован: 01 сен 2008, 19:14
Версия LabVIEW: 8.6, 2009
Откуда: Südtirol-Italien
Контактная информация:

Re: Publish Subscriber Design Pattern

Сообщение montanaro »

Hallo eg,

ja es funktioniert. Somit entfällt das Event "subscrive daten". Beim Start des Client werden alle für den Client wichtigen Daten dem Dispatcher mitgeteilt. Wird der Client geschlossen, so wird die Referenz sauber aus dem Dispatcher gelöscht.
Interessant wäre noch folgendes: Beim Start eines Clients X werden die Daten nicht nur am Dispatcher angemeldet, sondern auch z.B. von einem anderen Client Y die aktuellen Werte abgeholt.
Ein Client wäre dann bei Neustart im System voll aktualisiert.
Eine Mölichkeit wäre die Daten in eine Datei abspeichern. Bei Start des Client die Werte aus dieser Datei herausziehen.
Schöner aber wäre es, wenn ein anderer Client X angestossen wird, alle für den Client Y interessanten Daten abzuschicken. Vorausgesetzt, dass es diesen Client gibt (ausgeschaltet,...)
Was meinst du? Wirst du mich durch einen Lösungsansatz wieder arbeiten machen?
Danke
montanaro
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Publish Subscriber Design Pattern

Сообщение Eugen Graf »

Hallo montanaro,

könntest du bitte sagen wozu du dieses Pattern benutzen willst, wenn es kein Geheimnis ist?

Klar, es ist alles möglich, du kannst beim jeden Anmelden eines neuen Clients, alle bereits angemeldete Clients (generell vom Dispatcher) anstossen etwas zu senden.
Oder du kannst ein neues Topic erstellen und gleich nach dem anmelden des ClientsX etwas zu senden, damit der ClientY darauf reagiert. Das ist sogar besser, denn dann brauchst du nichts am Dispatcher umzuprogrammieren.

Gruß, eg
montanaro
user
user
Сообщения: 81
Зарегистрирован: 01 сен 2008, 19:14
Версия LabVIEW: 8.6, 2009
Откуда: Südtirol-Italien
Контактная информация:

Re: Publish Subscriber Design Pattern

Сообщение montanaro »

Hallo eg,

ich arbeite unter anderem als Systemintegrator für die Gebäudetechnik. Unter anderem weil ich auch noch etwas anderes mache.
In Zusammenhang mit einer Firma, die ich 2003 gegründet hatte und dann 2005 wieder ausgestiegen bin, hatten wir ein System für Gastro-Betriebe entwickelt, was es in dieser Form noch nicht gab. Also so was wie den Orderman. In Zusammenhang mit diesem Projekt hatte ich sämtliche Testhardware eingekauft, die aber nicht eingesetzt wurde. So auch 6 Touch Pannel's.
Nun diese habe ich bei mir in der Werkstatt aufgestellt und mit Labview benutzt.
Ich hatte dann vor langer Zeit mal dein "Kind" (so hast du es mal genannt) angesehen. Da das Arbeiten mit Shared Variable extrem nervig ist, begann ich in meiner Freizeit (also fast nie) deine Lösung durchzuarbeiten.
So fing ich zig-Mal an und verstand jedesmal etwas mehr. Ich habe keine Schulung bei Labview gemacht (angemeldet sehr wohl, aber immer wieder aus zeitmangel abgesagt).
Wir haben den selben Titel, nur habe ich Elektronik studiert, bin deshalb kein Informatiker. Mittlerweile gefällt mir deine Lösung so sehr, dass ich begonnen habe, die Clients in meiner Werkstatt
zu benutzen. Und so fing alles an...Deshalb meine Fragen.
Gruß
montanaro (was so viel wie Bergmensch auf deutsch heisst)
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Publish Subscriber Design Pattern

Сообщение Eugen Graf »

Sehr interessant :super:

Ich finde dieses Pattern auch sehr sehr schön, ich hatte mal ein Buch gelesen und versucht zu verstehen worum es bei diesem Design Pattern geht. Es hat mir so gefallen, dass ich angefangen habe die gelesene Theorie in Praxis mit :labview: umzusetzen. Es war gar nicht so schwer, wie ich gedacht habe. Ich hatte gehofft, dass ich dieses Pattern in allen meiner Projekte einsetze, denn es ist wirklich sehr schön, wenn man eine zentrale Stelle im Programm hat (Dispatcher) und alles, was im Programm passiert zentral anschauen und ggf. debuggen kann. Außerdem gibt es eine Möglichkeit über TCP/IP vom anderen Rechner auf den Dispatcher zuzugreifen oder sogar Aufgaben auf mehrere Rechner zu verteilen (verteilte Anwendungen).
Leider haben die meisten Programmierer selbst schon eine bestimmte Vorgehensweise beim Programmieren und deshalb kein großes Interesse an fremden Lösungsansätzen.
Na ja, hoffentlich kommt was daraus. Ich denke ich werde das Pattern mit der Zeit verbessern (es gibt ja überall einiges zu verbessern) und auf OOP Basis umprogrammieren.
Viel Spaß mit dem Pub/Sub und falls Fragen kommen, beantworte ich diese auch gerne.

Gruß, eg
Ответить

Вернуться в «Programmiermuster»