LabVIEWForum.de - Semaphoren per Variable setzen

LabVIEWForum.de

Normale Version: Semaphoren per Variable setzen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo Leute

Ich habe auf meinem cRio-Controller (9012) ein vi, das von mehrerer Orten auf ein File zugreifft. Deshalb wollte ich das File durch Semaphoren schützen, so dass sichergestellt wurde, dass nicht gleichzeitig darauf zugegriffen wurde. Das heisst, ich erstelle einen Semaphore, setze in runter, greiffe auf das File zu und setze ihn wieder hoch. Das ganze Funktioniert, solange ich den Ausgang nach dem Erstellen direkt weiterverbinde. Nun ist aber so, dass ich an diversen Orten diese Semaphoren benötige, und ich eigentlich nicht überall hin ein Kabel ziehen möchte. Deshalb habe ich einen Indikator gesetzt und danach einfach per Lokale Variable den Semaphore rauf-bzw runtersetzen. Und das funktioniert leider nicht, ich kriege immer einen Error1, was so viel heisst wie dass ein Inputparameter falsch ist. Habe mal ein Bild angehängt wie ich es möchte, nur funktioniert es so nicht.

Mir ist klar, dass es in diesem Bild keinen Sinn macht, mit Variablen zu arbeiten, da sie direkt nebeneinancer liegen. Soll nur das Prinzip erklären. Kann mir jemand sagen, warum das nicht geht?


MFG Corono
Benutze an jeder Stelle, an der Du die Semphore benutzen möchtest, das VI "Obtain Semaphore Reference" und einen Namen für die Semaphore. So musst Du nix über Variablen oder Drähten verteilen und hast eine Reference auf die Semaphore.
' schrieb:Benutze an jeder Stelle, an der Du die Semphore benutzen möchtest, das VI "Obtain Semaphore Reference" und einen Namen für die Semaphore. So musst Du nix über Variablen oder Drähten verteilen und hast eine Reference auf die Semaphore.

Also erstens sollte man zu jedem Create Semaphore auch ein Destroy Semaphore tun. Die Semaphore selber ist zwar bedingt durch den Namen immer dieselbe aber sie merkt sich wie oft jemand sie "obtained" hat und wird erst wirklich freigegeben wenn die Applikation abgeschlossen wird oder wenn die letzte Referenz geschlossen wird. Zudem verbraucht jede Referenz auf eine Semaphore oder andere Objekte etwas Speicher für die Referenz selber.

Zweitens sollte an einer Stelle am Anfang in der Applikation eine entsprechende "named" Semaphore erzeugt werden die erst am Ende der Applikation wieder freigegeben wird. Das stellt sicher das diese Semaohore im Speicher bleibt auch wenn sie anderenorts regelmässig erzeugt und wieder freigegeben wird.

Drittens muss die erste Erstellung der Semaphore an einer Stelle im Program sein die Objekt nicht mehr nötig ist. Das gilt übrigens für alle refnum based Objekte in LabVIEW. Erstellen davon in einem Hierarchy Context der irgendwann Idle wird, hat automatisch die zwangsweise Zerstörung des entsprechenden Objektes zur Folge auch wenn diese Objekt irgendwo anders etwa durch globale Variablen noch verwendet wird.

Rolf Kalbermatter
Hey Leute

Vielen Dank für die Hilfe. So funktioniert es.

MFG Corono
Referenz-URLs