(26.01.2015 09:33 )ahebauer schrieb: Hallo,
ich habe eine Frage zum Verhalten von DLLs, wenn sie aus LabVIEW heraus aufgerufen werden (über 'Call Library Funtion Node'):
wie verhält sich eine DLL, wenn sie von zwei Programmteilen gleichzeitg aufgerufen wird? In meiner Anwendung laufen zwei Prozesse
parallel und unabhängig zueinander und beide müssen auf die selbe DLL zugreifen. Jetzt könnte ich den gleichzeitigen Zugriff natürlich
von vorne herein verhindern, wenn ich den DLL-Aufruf in einem ablaufvarianten VI unterbringe. Ich möchte aber gerne wissen, wie sich
eine DLL verhält, wenn sie zur gleichen Zeit von 2 Programmteilen aufgerufen wird. Puffert die DLL die Anfragen (bzw. merkt LabVIEW,
dass die DLL gerade belegt ist und wartet) und die Abarbeitung erfolgt sequentiell, oder geht eine Anfrage verloren (oder resultiert in
einer Fehlermeldung von LabVIEW, da die DLL nicht aufgerufen werden konnte)?
Vielen Dank
Michael
Eine DLL wird grundsätzlich immer in den Prozessspeicher geladen. Jeder Prozess hat seinen eigenen, geschützten Prozessspeicher, den ein anderer Prozess nicht einfach so lesen (und schon gar nicht schreiben) darf. LabVIEW ist ein Prozess und Deine andere Applikation ist ein anderer Prozess. Die DLL ist also grundsätzlich zweimal, völlig unabhängig voneinender im Speicher geladen. Das heisst dass allfällige globale Variablen in der DLL in jeder Applikation ihren eigenen unabhängigen Werte nebeneinander halten können. Aber wenn die DLL irgendeine geteilte Resource anspricht (File, Device, etc) dann gelten selbstverständlich die selben Regeln wie wenn zwei unabhängige Prozesse diese Resource anzusprechen versuchen.
Innerhalb der selben Applikation gelten andere Regeln. LabVIEW ist grundsätzlich Multithreading. Wenn die Call Library Node nicht so konfiguriert wird dass sie im UI Thread ausgeführt wird und Du keine anderen Massnahmen triffst wie eine Semafore oder den DLL Aufruf in ein non-reentrantes VI legen das Du jeweils von den verschiedenen Orten aufrufst, dann werden die Funktionen grundsätzlich parallel und durchaus auch überlappend aufgerufen. Wenn Deine Funktion das nicht haben kann, dann ist es zwingend erforderlich um entweder die DLL Node im UI Thread auszuführen oder in ein VI zu legen das non-reentrant ist und diese Funktion(en) immer durch dieses VI aufzurufen.