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 mit externer DLL macht kein Multithreading



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!

04.12.2009, 11:23
Beitrag #5

wernerIBN Offline
Datenflussumgeher
**


Beiträge: 124
Registriert seit: Sep 2009

8.6 und 2011
2000
DE

52425
Deutschland
VI mit externer DLL macht kein Multithreading
Also erst mal vielen Dank für die hilfreichen und sehr sachkundigen Antworten.
Ich kann momentan keinen sinnvollen Beispielcode senden, da mein Projekt von 3 Leuten bearbeitet wird, und ich erst mal ein Reduziertes Projekt machen muss, damit man das Problem isoliert erkennt, mach ich aber sobald ich etwas Luft habe.

Ich denke aber, ich kann euch (rolfk und IchSelbst) genau erklären wo mein Problem liegt, Ihr seid ganz nah dran.

Erst mal zu euren Antworten, und meiner Zusammenfassung dazu:

1.) Ablaufinvariante Ausführung an oder aus
Ablaufinvariant an: mehrere gleiche VIs werden parallel abgearbeitet.
Ablaufinvariant aus: mehrere gleiche VIs werden nacheinander abgearbeitet.

2.) In UI-Thread ausführen oder In beliebigem Thread ausführen
In UI-Thread ausführen: Im UI Thread ausführen bedeutet in dem EINEN, SPEZIELLEN Thread, und da es davon eben nur EINEN gibt kann jeweils nur EINE Sache gleichzeitig laufen.
In beliebigem Thread ausführen: läuft gleichzeitig und mehrfach.

So hab ichs auch gedacht, aber es bisher nicht so hinbekommen, dass meine 4 VIs gleichzeitig laufen.


Ich erklärs jetzt haarklein, damits klar wird:

Ich habe eine DLL, werner.dll.
In werner.DLL sind 4 Funktionen: open-send-read-close
open öffnet eine TCP/IP-Verbindung zu einer bestimmten IP-Adresse mit einem bestimmten Port und merkt sich das dann mit einer Verbindungsnummer.
send-read-close bekommt jeweils die Verbindungsnummer, und weiss dann auf welche Verbindung sich der Vorgang bezieht.
Soweit die DLL.

Nun habe ich 4 VIs: open.vi send.vi read.vi close.vi die jeweils per Call Library Nodes die 4 DLL-Funktionen open-send-read-close kapseln.

Ich habe nun 4 Geräte: Gerät1-Gerät2-Gerät3-Gerät4.

Die 4 Geräte haben jeweils ein eigenes VI: Gerät1.vi Gerät2.vi Gerät3.vi Gerät4.vi

In jedem der Geräte-VIs wird der Zyklus open-send-read-close durchlaufen. Natürlich könnte man sagen, warum jedes mal auf und zu machen, wäre nicht besser zu Programmbeginn einmal die Verbindung zu öffnen, und nach Ende einmal zu schliessen ? Der Grund ist, dass es Langzeitmessungen sind, und daher auch mal ein Gerät ausfallen könnte, und dann ist es kompliziert, die ausgefallenen Geräte im laufenden Betrieb wieder einzufangen. Ausserdem arbeite ich mit Queues zur Automatisierung.

Aufbau der Geräte-VIs:

Gerät1.vi besteht aus open.vi send.vi read.vi close.vi mit der Verbindungsnummer 0 und einer eigenen IP und Portadresse.
Gerät2.vi besteht aus open.vi send.vi read.vi close.vi mit der Verbindungsnummer 1 und einer eigenen IP und Portadresse.
Gerät3.vi besteht aus open.vi send.vi read.vi close.vi mit der Verbindungsnummer 2 und einer eigenen IP und Portadresse.
Gerät4.vi besteht aus open.vi send.vi read.vi close.vi mit der Verbindungsnummer 3 und einer eigenen IP und Portadresse.

open-send-read-close jedes Geräte-VIs sind auch mit einem Error-Cluster durchverkabelt.


Wenn ich nun die 4 Geräte-VIs in eine Case setze, ohne die 4 Geräte-VIs mit Wires zu verbinden, dann wird jedes Geräte-VI nur einmal aufgerufen, aber als SUB-VI wird natürlich open-send-read-close je 4 mal aufgerufen.

Ich möchte, dass die 4 Geräte-VIs parallel laufen.

Nach meiner heutigen Sicht würde ich daher wie folgt vorgehen:

1.: die Geräte-VIs Gerät1.vi Gerät2.vi Gerät3.vi Gerät4.vi bekommen Ablaufinvariant aus weil mehrere gleiche VIs nacheinander abgearbeitet werden sollen, denn es soll ja Gerät1.vi nur einmal laufen. Da kein Call Library Node in diesen Geräte-VIs ist (sondern nur in den SUB-VIs) kann ich da was UI-Thread oder beliebigem Thread angeht nix einstellen.

2.: die 4 SUB-VIs: open.vi send.vi read.vi close.vi bekommen bekommen In beliebigem Thread ausführen damit sie gleichzeitig laufen, undAblaufinvariant im Call Library Node an weil mehrere gleiche VIs gleichzeitig (aber mit verschiedenen Verbindungsnummern) abgearbeitet werden sollen, denn es sollen ja die 4 Geräte-VIs Gerät1.vi bis Gerät4.vi gleichzeitig laufen.

Sorry für die viele Schreiberei - aber es war auch für mich sehr hilfreich das aufzuschreiben, das kommt in meine Doku rein.

Sehe ich alles richtig ?

Werner

Erfahrung ist die Summe der gemachten Fehler
KISS - Keep it simple and stupid
Walking on water and developing software from a specification are easy if both are frozen. – Edward V Berard
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Nachrichten in diesem Thema
VI mit externer DLL macht kein Multithreading - wernerIBN - 04.12.2009 11:23

Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Aufruf externer Bibliotheken / Keyence / Schnittstelle _Markus_ 1 6.003 20.05.2019 12:23
Letzter Beitrag: _Markus_
  LabView Wrapper - PostUserEvent aus externer DLL Stephan235 3 10.152 22.07.2015 13:28
Letzter Beitrag: rolfk
  Einbinden externer DLL St_Markus 1 6.528 28.05.2013 15:25
Letzter Beitrag: rolfk
  VI als externer Code finalr 1 4.720 23.11.2012 08:58
Letzter Beitrag: GerdW
  Array Elemnte von externer Funktion verbinden Heili 3 4.947 12.11.2010 13:54
Letzter Beitrag: Lucki
  Debugging externer DLL Tom_UniMainz 4 8.430 22.07.2009 07:31
Letzter Beitrag: rolfk

Gehe zu: