VI mit externer DLL macht kein Multithreading
Ich habe eine Reihe von VIs erstellt, die eine von mir VS2005 erstellte C-DLL aufrufen, in welche ich threadsicher Funktionen erstellt habe, um über winsock mit Messgeräten zu kommunizieren. Es gibt da 4 Funktionen, im Prinzip open-send-read-close. Im VI führe ich immer diese 4 Funktionen aus. Jedes Gerät hat eine Verbindungsnummer, über die ich in der DLL auf Verbindungsdetails (Port, IP-ADresse etc) über ein Array zugreife. Also können mehrere dieser Zugriffe gleichzeitig, also in C in verschieden Thread laufen, ohne sich gegenseitig zu beeinflussen.
In LabVIEW stelle ich nun fest:
Gerät 1 benötigt fürs VI 100ms
Gerät 2 benötigt fürs VI 200ms
Gerät 3 benötigt fürs VI 100ms
Gerät 4 benötigt fürs VI 300ms
wenn ich die VIs einzeln aufrufe.
Wenn ich alle 4 VIs in einen Case stelle, ohne irgendwelche Verbindungen zueinander, dauert der gesamte Case 700ms - also als ob die VIs nacheinander laufen. das verstehe ich nicht. Gehe ich richtig in der Annahme, dass 4 VIs in einem Case, die nicht irgendwie verbunden sind, parallel abgearbeitet werden sollten ?
Ich vermute mal, das LabVIEW sieht, in allen 4 VIs werden jeweils die 4 DLL-Funktionen open-send-read-close aufgerufen, und die sind natürlich in jedem einzelnen VI sauber mit dem Error-Cluster durchverkabelt, also verbunden. Aber es können gleichzeitig 4 VIs open aufrufen, aber LV machts nicht.
Darauf hin habe ich an folgenden Einstellungen gedreht, aber keine echte Erkenntniss gewonnen, was genau da passiert:
Frage 1:
VI-Eigenschaften -> Ausführung -> Ablaufinvariante Ausführung an oder aus
Was genau macht das, bringt mich das näher an meine Ziel der parallelen Ausführung ?
Frage 2:
Knoten zum Aufruf externer Bibliotheken -> In UI-Thread ausführen oder In beliebigem Thread ausführen
Ich habe den Eindruck, dass sich ausser der Farbe nichts ändert, es dauert immer 700ms.
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
|