Hi,
erstmal vielen Dank für die Antworten. Ich glaube, ich habe teilweise noch nicht so ganz verständlich machen können, was ich mir vorgestellt hatte.
' schrieb:Zu LVOOP: Das nicht. Geht auch ohne.
Hm, und ohne dass man globale Variablen oder Ähnliches verwendet? Unten redest Du auch immer von "Klassen". Ich dachte, das ist dann automatisch LVOOP?!
' schrieb:Der Klasse über die Steuerqueue den Befehl senden, sich selbst zu beenden.
Ja, das ist natürlich eine Möglichkeit, die auch ein Kollege vorgeschlagen hatte. Vielleicht ist das tatsächlich die beste Möglichkeit.
' schrieb:Das klingt, als wolltest du die Klasse, die die RS232 handlet, als Methode einer übergeordneten, applikationsspezifischen Klasse haben. Da sehe ich aber keine Notwendigkeit für. Für so kompliziert halte ich das mit den Queues nicht.
Den fett markierten Text verstehe ich nicht. Welches VI bekommt die Änderung an der Klasse nicht mit? Warum sollte das übergeordnete VI eine Änderung in der Klasse mitbekommen?
Ich hab mal folgendes überlegt:
Das mit dem Listener-Management könnte man über ein Array of Queue machen. Jeder der Daten haben will, muss der Klasse eine Queue (Referenz auf Queue) übergeben (das geht). Diese Queue wird dann nur von diesem einen Anmelder ausgelesen. Die RS232-Klasse merkt sich die Queues in einer Liste (also in einem Array). Das Management, welche empfangenen Daten über welche Queue weitergesendet werden müssen, liegt innerhalb der RS232-Klasse.
Genau so habe ich es auch implementiert. Und genau da liegt der Punkt, wo ich ein Problem habe. Bei mir sind die Listener als ein Array von Queues innerhalb der Objektdaten implementiert. Am Anfang ist das leer. Jetzt wird das Kommunikations-VI gestartet, das dann durchlaufen soll (dazu, wie und wo das gestartet wird, unten nochmal mehr). Jetzt registriert sich ein anderes VI als Listener (gibt eine Referenz auf eine Queue an eine AddListener Methode der Klasse, die das in das Listener-Array hinzufügt). Allerdings hat das Kommunikations-VI ja jetzt keinen Zugriff auf dieses Array, da es in den privaten Daten der Klasse liegt. Entweder kann ich das als globale Variable machen (unschön wegen Datenkapselung, oder?), oder selber wieder in eine Queue legen (was dann zu einer Queue mit einem Array von Queues führt - nicht grade elegant), oder es geht irgendwie anders und ich sehe das nur nicht.
Warum ich das ganze als Klasse machen wollte, war, dass ich dachte, ich könnte es als Singleton implementieren. D.h., ein VI fordert die Kommunikation an und bekommt eine "Referenz" darauf und kann jetzt Queues als Listener registrieren und andere Kommunikation machen. Jetzt wird ein anderes VI gestartet, dass die Kommunikation auch anfordert. Da sie schon existiert, bekommt es nur eine Referenz auf das schon existierende Objekt zurück und kann damit ganz normal weitermachen (Ich hatte gedacht, das als Mischung zwischen den Beispielen Grundlagen->Objektorientiert->Design Pattern.lvproj und Grundlagen->Objektorientiert->ReferenceObject.lvproj zu implementieren).
' schrieb:Man kann auch zusammen mit den Sendedaten eine Queue an die RS232-Klasse übergeben. Die Antwort auf diese Sendung geht dann an diese Queue.
Die Antwort-Queue ist gar nicht das Problem, sondern die Queues für den kontinuierlichen Datenstrom.
Jetzt noch zum Starten des kontinuierlich laufenden VIs: Da ich es ja in verschiedenen VIs dynamisch verwenden wollte, kann ich es eigentlich nicht in einem VI ablegen, denn dann würde es ja beendet, wenn dieses VI beendet wird, obwohl vielleicht ein anderes VI noch darauf zugreift. Ich hatte deshalb gedacht, die Klasse bekommt eine StartCommunication-Methode, die dann über eine Referenz auf das RS232-VI dieses startet. Aber das ist auch nicht so richtig schön, finde ich.
Wenn ihr wollt, kann ich mal ein Beispiel-Projekt hochladen, wo ich die eigentliche Kommunikation rausnehme, damit ihr mal seht, wie das momentan aussieht.
Gruß,
Tobias