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, 10:24
Beitrag #1

DJ_MotionX Offline
LVF-Grünschnabel
*


Beiträge: 10
Registriert seit: Mar 2009

derzeit 10.0
2004
de

1020
Oesterreich
VI-Zurücksetzen
Hallo. Hab eine kleines unschönes Problem beim aufruf meiner Dll. Habe zum Aufruf meiner dll einen Tread gebaut der das ganz kontrolliert falls sich die dll irgendwie verabschiedet. Dies geschieht in folgendem ablauf:
1. Controller Thread wird gestartet.
2. Empfängt der controller eine message (Laut bild: Bitte starte Init) startet der controller einen weiteren thread in dem die dll Funktionalität aufgerufen wird und gleichzeitig einen Timer. witer gibts 2 möglichkeiten
3.a Dll funktion passt und controller bekommt die message alles ok und fertig - oder
3.b Dll verläuft sich und das Timeout wird aktiv. Dann breche ich mit (VI-Abbrechen und VI-Schließen) laut bild das ETACan_Init.vi und somit auch die dll ab.

- Setzte ich das timeout nun so niedrig dass die Dll Funktion nie ferig ausgeführt werden kann passt auch noch alles.
- Bleibt die dll funktion (wegen falscher Hardwarekonfiguration) stecken kommt zwar noch laut bild die richtige message beim controller an aber nach dem abbrechen kommt von LabVIEW ein fenster mit der Message: VI zurücksetzen: ETACan_Init.vi und das ganze LabVIEW verabschiedet sich. Besser gesagt nicht ganz mein controller vi läuft weiter (count zählt weiter hoch) jedoch kann ich keine Eingaben mehr tätigen. Nur noch stg-alt-entf hilft.

Horcht sich kompliziert an bei fragen einfach nachhaken.

Was soll ich machen?
kann ich das zurücksetzen irgendwie ausschalten?
Kann ich die dll suaberer beenden?


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
20.08.2009, 10:34
Beitrag #2

abrissbirne Offline
LVF-Stammgast
***


Beiträge: 480
Registriert seit: Aug 2007

LV2009, LV2010
2007
EN

66123
Deutschland
VI-Zurücksetzen
' schrieb:Hallo. Hab eine kleines unschönes Problem beim aufruf meiner Dll. Habe zum Aufruf meiner dll einen Tread gebaut der das ganz kontrolliert falls sich die dll irgendwie verabschiedet. Dies geschieht in folgendem ablauf:
1. Controller Thread wird gestartet.
2. Empfängt der controller eine message (Laut bild: Bitte starte Init) startet der controller einen weiteren thread in dem die dll Funktionalität aufgerufen wird und gleichzeitig einen Timer. witer gibts 2 möglichkeiten
3.a Dll funktion passt und controller bekommt die message alles ok und fertig - oder
3.b Dll verläuft sich und das Timeout wird aktiv. Dann breche ich mit (VI-Abbrechen und VI-Schließen) laut bild das ETACan_Init.vi und somit auch die dll ab.

- Setzte ich das timeout nun so niedrig dass die Dll Funktion nie ferig ausgeführt werden kann passt auch noch alles.
- Bleibt die dll funktion (wegen falscher Hardwarekonfiguration) stecken kommt zwar noch laut bild die richtige message beim controller an aber nach dem abbrechen kommt von LabVIEW ein fenster mit der Message: VI zurücksetzen: ETACan_Init.vi und das ganze LabVIEW verabschiedet sich. Besser gesagt nicht ganz mein controller vi läuft weiter (count zählt weiter hoch) jedoch kann ich keine Eingaben mehr tätigen. Nur noch stg-alt-entf hilft.

Horcht sich kompliziert an bei fragen einfach nachhaken.

Was soll ich machen?
kann ich das zurücksetzen irgendwie ausschalten?
Kann ich die dll suaberer beenden?
Es gibt immer eine sauberere Lösung eine DLL zu beenden, als VI Abbrechen und VI Schließen. Ich denke das sollte dir doch bewusst sein.
Die Frage ist wie arbeitet dein Thread? Beinhaltet der Thread Hardwarezugruffe (wovon ich ausgehe)? Wenn ja, wie sicherst du dich gegen einen parallelen Hardwarezugriff ab (Thread Safe)? Gibst du Speicherbereiche wieder "sauber" frei (mit der Schlaghammermethode nicht!)? Man kann einen Thraed durchaus programmatisch beenden. Dafür stehen verschiedenste Möglichkeiten zur Verfügung. Eine einfache Methode ist einfach den Returnwert NO_ERROR zurückzugeben.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
20.08.2009, 10:51
Beitrag #3

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.689
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
VI-Zurücksetzen
' schrieb:falls sich die dll irgendwie verabschiedet.
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.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
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.305
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 


Gehe zu: