INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

VI-Zurücksetzen



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

20.08.2009, 11:19 (Dieser Beitrag wurde zuletzt bearbeitet: 20.08.2009 11:22 von rolfk.)
Beitrag #4

rolfk Offline
LVF-Guru
*****


Beiträge: 2.317
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
VI-Zurücksetzen
' schrieb:Das kann nicht sein.
Die DLL muss so konstruiert werden, dass die immer einen aktuellen Status liefern kann. Wenn die DLL beendet - sprich mit der Holzhammermethode abgebrochen - werden soll, so kann man auch hierfür in die DLL eine Funktionalität einbauen.

Alles andere, besondern das brachiale Aus-Dem-Speicher-Entfernen, halt ich nicht für gut.

Wenn du die DLL per VI-Beenden abbrichst, kann das sehr lange bis unendlich dauern. Jenachdem wie tief die DLL im Betriebssystem gerade mit irgendwelchen Handles hängt.

Die einzige Weise um eine nicht kooperative DLL aus dem Speicher zu werfen ist den ganzen Prozess zu terminieren. LabVIEW selber kann da gar nichts tun. Solange die DLL hängt kann LabVIEW diese nicht beenden.

Du könntest in LabVIEW 8.2 und neuer die Callback Feature (meiner Meinung nach ein falsch gewählter Name da es sich mehr um ein asynchrones Management interface handelt) der Call Library Node verwenden. Dazu musst Du extra Funktionen in der DLL implementieren die Du als Synchronisationsfunktionen in die Callbackkonfiguration der Call Library Node einfügst. Die Reserve Funktion wird aufgerufen bevor die eigentlich Funktion aufgerufen wird. Hier kannst Du einen Pointer zurückgeben zu einer Struktur in der du jedwelche beliebige Information abspeicherst. Die Unreserve Funktion wird aufgerufen nachdem die Funktion beendet ist und hier kannst Du den Callstack zu Deiner DLL Funktion entfernen und auch eventuel während der Reserve Funktion angelegte Resourcen freigeben.

Die Abort Funktion wird aufgerufen, ja genau!! wenn Du die LabVIEW Hierarchy die die Call Library Node enthält abbrichst währenddem LabVIEW die entsprechende DLL Funktion am Aufrufen ist. Hier wirst Du also ganz einfach aus dem InstancePointer heraussuchen müssen was Du denn so eventuel an Resourcen in der DLL geöffnet hast (oder diese in einer DLL internen global speichern müssen aber dann bitte mit einem Semaphore geschützt wegen Multithreading) und diese entsprechend forciert abbrechen.

Wie abbrechen??? Tja das hängt von der DLL/Library ab die Du hier aufrufst. Das VISA API ist zum Beispiel so intelligent, dass wenn Du eine Session abschliesst mit Close wo noch ein Read am warten ist, dass das Read sich netterweise mit einem entsprechenden Fehler beendet. Das bedingt aber dass Dein API Multithreading safe ist und auch auf so eine Weise funktionieren kann. Ob das Deine CAN Library kann ist noch die grosse Frage! Wink-2

Rolf Kalbermatter

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Nachrichten in diesem Thema
VI-Zurücksetzen - DJ_MotionX - 20.08.2009, 10:24
VI-Zurücksetzen - abrissbirne - 20.08.2009, 10:34
VI-Zurücksetzen - IchSelbst - 20.08.2009, 10:51
VI-Zurücksetzen - rolfk - 20.08.2009 11:19

Gehe zu: