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
|