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 

c-struktur in LabVIEW



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!

28.01.2009, 18:26
Beitrag #11

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
c-struktur in LabVIEW
@IchSelbst:
Durchsuche einfach mal den letzten Thread von verflixxt, da hat er alles schon mal hochgeladen.

http://www.LabVIEWforum.de/index.php?sho...=10302&hl=

Gruß, Jens

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
29.01.2009, 12:20
Beitrag #12

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.687
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
c-struktur in LabVIEW
' schrieb:ich habe versucht das ganze jetzt so zu lösen.
Ich kann mit deinem SubVI nicht wirklich arbeiten. Viel zu breit, viel zu wenige SubVI.

Mach ein neues mit z.B. einer Statemachine. Für jeden Schritt einen eigenen Case. Nach jedem Zugriff auf die DLL muss abgefragt werden, ob der Rückgabewert <> Null ist. Bei <> Null wird GetLastError abgefragt und in einem String abgezeigt.

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
01.02.2009, 09:35
Beitrag #13

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
c-struktur in LabVIEW
' schrieb:Ich kann mit deinem SubVI nicht wirklich arbeiten. Viel zu breit, viel zu wenige SubVI.

Mach ein neues mit z.B. einer Statemachine. Für jeden Schritt einen eigenen Case. Nach jedem Zugriff auf die DLL muss abgefragt werden, ob der Rückgabewert <> Null ist. Bei <> Null wird GetLastError abgefragt und in einem String abgezeigt.

Also das mit dem GetLastError() funzt bei LabVIEW leider nicht. GetLastError ist ein dummes Überbleibsel aus der single-threaded Windows 3.x und früheren Zeiten. Windows speichert per Thread einen GetLastError() Wert ab. Das Problem ist dass LabVIEW hochgradig multi-treaded ist und nur eingeschränkte Kontrolle über die exakte Ausführung von VIs in Threads zulässt. Wenn Du die Call Library Node als reentrant konfigurierst kann diese in jedem der ungefähr 4 bis 8 Threads ausgeführt werden die LabVIEW derzeitig per Execution System anlegt. Das Execution System ist so ein bisschen das unterste Niveau wo Du an LabVIEW sagen kannst wie es mit Multithreading umgehen soll, da man einzelne VIs verschiedenen von 6 Execution Systems zuweisen kann. Das Problem ist hier dass die Ausführung der eigentlichen DLL Funktion und des anschliessend GetLastError() hier in völlig verschiedenen Threads geschehen kann und normalerweise auch tut.

Die naheliegende Lösung um die zwei DLL Nodes als non-reentrant zu konfigurieren und dadurch im einzigen garantiert single-threaded Execution System, dem User Interface Execution System, auszuführen funktioniert leider auch nicht. LabVIEW führt nämlich in diesem Execution System auch alle Interaktionen mit dem OS aus die nicht multithreading-sicher sind. Dazu gehören viele OS Aufrufe wie etwa das Zeichnen des User Interfaces und die meisten dieser Windows API Funktionen beinflussen diesen GetLastError() auch. Zu der Zeit wo das LabVIEW Diagram dann die GetLastError() Funktion aufruft um den Status des vorigen DLL Aufrufs zu lesen, hat LabVIEW ziemlich sicher schon andere Windows APIs aufgerufen die diesen Wert ebenfalls beinflussen. Das Lesen des GetLastError() direkt vom LabVIEW Diagramm ist deshalb im besten Fall unzuverlässig aber gibt meist ganz einfach falsche Informationen zurück. Wenn GetLastError() wirklich nötig ist dann gibt es nur zwei zuverlässige Lösungen. Entweder Multithreading in LabVIEW ganz ausschalten (gibt da ein INI Token dafür aber diese Lösung ist ziemlich brutal) oder eine Wrapper DLL schreiben die sowohl den eigentlichen Aufruf der DLL Funktion und den anschliessenden GetLastError() Aufruf in eine einzige Funktion verpackt. Der Aufruf eines DLL Knotens ist nämlich garantiert in einem einzigen Thread.

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
01.02.2009, 12:32
Beitrag #14

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.687
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
c-struktur in LabVIEW
' schrieb:LabVIEW führt nämlich in diesem Execution System auch alle Interaktionen mit dem OS aus die nicht multithreading-sicher sind.
Huh(naja, eigentlich hab ich nichts anderes erwartet).

Wenn unser Rolf K. spricht erfährt man immer interresante Sachen. Wie hier über GetLastError auf dem OS.

Hinweis:
Das GetLastError, das ich oben erwähnt habe, ist eine Funktion aus der DLL ZEBSDK. [*grübel*] Und ich gehe mal davon aus, das wird nicht nur ins OS weitergeleitet.

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
02.02.2009, 07:42
Beitrag #15

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
c-struktur in LabVIEW
' schrieb:Das GetLastError, das ich oben erwähnt habe, ist eine Funktion aus der DLL ZEBSDK. [*grübel*] Und ich gehe mal davon aus, das wird nicht nur ins OS weitergeleitet.

Ohhhhh! Huh

Da ist mir entgangen. In dem Falle wird es wohl ganz einfach eine globale Variable sein. Ich denke mal dass sich die Programmierer nicht die Mühe gemacht haben um hier eine Variable per aufrufenden Thread anzulegen. Solange man dann in so einem Fall die DLL schön sequentiell anruft wäre der GetLastError() wohl schon aussagekräftig. Aber ob das wirklich so ist müsste in der Dokumentation zur DLL stehen oder wenn nicht, ausführlich getestet werden.

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 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Struktur mit Zeiger auf weitere Struktur an DLL übergeben Wheeliemaster 2 6.862 27.05.2015 08:40
Letzter Beitrag: Wheeliemaster

Gehe zu: