LabVIEWForum.de - Frage zu CIN (Bezüglich Semaphoren-Implementierung)

LabVIEWForum.de

Normale Version: Frage zu CIN (Bezüglich Semaphoren-Implementierung)
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen

In LabVIEW sind ja beispielsweise die Semaphore über eine CIN implementiert. Ich habe festgestellt, dass offenbar alle, während der Ausführung erzeugten Semphoren-Objekte, freigegeben werden, wenn das VI beendet wurde. Folglich muss der Code in der CIN irgendwie detektieren, dass das VI gestoppt wurde. Ich weiss, wie man detektieren kann, dass ein VI abgebrochen wurde (CINAbort() wird aufgerufen). Mir ist jedoch keine funktion bekannt, die aufgerufen würde wenn ein VI sich ohne Abbruch des Anwenders beendet. Hat jemand eine Ahnung, wie das bei der Semaphore implementiert wurde? Ich möchte diese Verhalten gerne in einer eigenen CIN nachbilden.

Lv71_img
Also erstens: Warum willst Du noch CINs verwenden? Das ist eine Legacy-Technologie und wird in zukünftigen neuen LabVIEW Platformen wohl nicht mehr unterstützt. Eventuel haben schon die aktuelen 64 Bit Platformen keinen Support für CINs mehr,

Zweitens das was Du siehst hat LabVIEW grundsätzlich für alles was eine Refnum hat. Ausser bei VISA in den Options ist das auch nicht auschaltbar.

Die Funktionalität die LabVIEW dafür intern verwendet ist zwar exportiert aber vollkommen undokumentiert. Gebrauch davon ist absolut auf eigenes Risiko und kann in jeder neuen LabVIEW Version plötzlich nicht mehr funktionieren.

Die Funktion die Du dazu in Deinem C Code aufrufen musst heisst:

typedef int32 (*CleanupProcPtr)(UPtr data);
TH_REENTRANT int32 RTSetCleanupProc(CleanupProcPtr proc, UPtr data, int32 mode);

proc ist eine Funktion die Du implementierst und die das Objekt sauber dealloziert, data ist Dein Objekt, mode ist 0 um die proc für das Objekt zu deinstallieren, etwa wenn Du das Objekt ordnungsgemäss schliesst, und grösser als 0 um sie zu installieren. Dabei bedeutet 1 dass Deine proc für das Dataobjekt aufgerufen wird wenn LabVIEW abgeschlossen wird und 2 bedeutet dass sie aufgerufen wird wenn das aktuelle Top-Level VI idle wird (was die default Operation für alle LabVIEW refnums ist).

Wie Du das für Deinen Code anwendest magst Du selber aussuchen und rumprobieren. Die Informationen hast Du, aber mache Dich darauf gefasst dass Du noch was debuggen musst.
Danke für die Antwort.
Bei CINs hast du eben diese 'Callback' funktionen wie CINAbort(), CINInit(), etc., die du bei DLLs unter LabVIEW 7.1 nicht hast. Das wäre der Grund, der bei mir für eine CIN spricht.
Ich bin überhaubt nicht scharf darauf, 'geheime' Features, die nicht offiziell freigelegt sind, zu benutzen. Der automatische Cleanup wenn ein VI Idle wird wäre schön, aber im Grunde reicht es ja auch, wenn die nicht zerstörten Objekte nach dem Schliessen von LabVIEW freigegeben werden, was ja problemlos zu implementieren ist.
Referenz-URLs