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 

Delphi-DLL mit globalen Variablen



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!

13.07.2009, 14:25
Beitrag #1

Bärbel Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 50
Registriert seit: Aug 2007

2020 64-bit / 2021 32-bit
2007
DE

52062
Deutschland
Delphi-DLL mit globalen Variablen
Hallöle,

ihr werdet es nicht glauben, aber wir hängen immer noch mit dieser Delphi-DLL rum, wegen der ich euch schon vor ca. 1 Jahr genervt habe.
Immerhin sind wir inzwischen an einem definierten Problem angekommen:
Ich rufe im LabVIEW-Programm 3 DLL-Funktionen auf, Init (bei Programmstart), Step (in einer While-Schleife), Final (bei Programmende).
Init öffnet zwei Dateien (mit globalen Handles oder wie auch immer das bei Delphi genannt wird) und legt große, globale Speicherbereiche an, die mit sinnvollen Werten vorbelegt werden.
Step liest die Dateien und nutzt die Speicherbereiche für Berechnungen. Einzelne Werte aus diesem Speicherbereich werden werden als double zurückgeliefert. (Die Rückgabe wurde bereits mit Dummy-Werten überprüft.)
Final schließt die Dateien und gibt den globalen Speicher wieder frei.

Es scheint so zu sein, dass die 3 DLL-Aufrufe (konfiguriert auf: beliebiger Thread) aber nicht auf dieselben Speicherbereiche zuzugreifen. Wird die Funktionalität des LabVIEW-Programms als Delphi-Programm geschrieben, das dann die DLL aufruft, funktioniert aber alles tadellos.

Kann mir vielleicht jemand erklären, wie LabVIEW DLL-Aufrufe handhabt? Was passiert mit globalen DLL-Variablen?

Ist doch eine tolle Frage fürs Sommerloch Cool

Grüße aus einem wirklich eklig warmen Büro,
Bärbel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
13.07.2009, 18:15 (Dieser Beitrag wurde zuletzt bearbeitet: 13.07.2009 18:15 von rolfk.)
Beitrag #2

rolfk Offline
LVF-Guru
*****


Beiträge: 2.306
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Delphi-DLL mit globalen Variablen
LabVIEW tut mit DLL Aufrufen nichts besonderes. Es ruft die Funktionen halt einfach auf und wenn Du Sie als reentrant konfigurierst dann tut es das halt von beliebigen Threads aus. Das hat auf wirklich globale Variablen absolut keinen Einfluss, ausser dass Du da Race Konditionen verursachen kannst.

Aber ich weiss nicht wie global Deine globalen Variablen sind und auch nicht ob Delphi da etwas eigenes macht wie automatisch Thread Local Storage (TLS) anlegen. Wenn es das tut sollte es wohl eine Möglichkeit geben um Delphi zu sagen das wirklich Global zu machen. Wie weiss ich leider nicht, meine Delphi Kenntnisse beschränken sich hauptsächlich auf die griechische Sagenwelt.

Kanns auch mal probieren alle Funktionsaufrufe im UI Thread zu machen. Wenn das Multithreading das Problem ist sollte es damit funktionieren auch wenn das Performance mässig natürlich meist nicht gewünscht ist, aber es gibt zumindest Anhaltspunkte wo man weitersuchen soll.

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
14.07.2009, 09:55
Beitrag #3

Bärbel Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 50
Registriert seit: Aug 2007

2020 64-bit / 2021 32-bit
2007
DE

52062
Deutschland
Delphi-DLL mit globalen Variablen
' schrieb:LabVIEW tut mit DLL Aufrufen nichts besonderes. Es ruft die Funktionen halt einfach auf und wenn Du Sie als reentrant konfigurierst dann tut es das halt von beliebigen Threads aus. Das hat auf wirklich globale Variablen absolut keinen Einfluss, ausser dass Du da Race Konditionen verursachen kannst.

Aber ich weiss nicht wie global Deine globalen Variablen sind und auch nicht ob Delphi da etwas eigenes macht wie automatisch Thread Local Storage (TLS) anlegen. Wenn es das tut sollte es wohl eine Möglichkeit geben um Delphi zu sagen das wirklich Global zu machen. Wie weiss ich leider nicht, meine Delphi Kenntnisse beschränken sich hauptsächlich auf die griechische Sagenwelt.

Kanns auch mal probieren alle Funktionsaufrufe im UI Thread zu machen. Wenn das Multithreading das Problem ist sollte es damit funktionieren auch wenn das Performance mässig natürlich meist nicht gewünscht ist, aber es gibt zumindest Anhaltspunkte wo man weitersuchen soll.
Danke für den Hinweis mit den Race Conditions, aber die können hier wirklich nicht auftreten. Ich hatte der Vollständigkeit halber aber bereits ausprobiert, ob es einen Unterschied macht, wenn ich die Aufrufe im UI Thread laufen lasse. Macht es aber nicht.

Also werden wir noch ein wenig im Delphi-Nebel stochern müssen, von dem ich leider auch nicht allzu viel verstehe. Schon gar nicht von den Compiler-Direktiven. Seltsam ist halt nur, dass die DLL-Aufrufe mit einem Delphi-Testprogramm funktionieren. Da wird dann gerne mit dem Finger auf mich (bzw. LabVIEW) gezeigt, seufz...

Trotzdem danke für die Anwort,
Bärbel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.07.2009, 20:51
Beitrag #4

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.698
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
Delphi-DLL mit globalen Variablen
' schrieb:Also werden wir noch ein wenig im Delphi-Nebel stochern müssen, von dem ich leider auch nicht allzu viel verstehe.
Welche Delphi-Version verwendest du denn?

Kast du mal die Schnittstelle der DLL zeigen?

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
15.07.2009, 06:32
Beitrag #5

rolfk Offline
LVF-Guru
*****


Beiträge: 2.306
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Delphi-DLL mit globalen Variablen
' schrieb:Danke für den Hinweis mit den Race Conditions, aber die können hier wirklich nicht auftreten. Ich hatte der Vollständigkeit halber aber bereits ausprobiert, ob es einen Unterschied macht, wenn ich die Aufrufe im UI Thread laufen lasse. Macht es aber nicht.

Also werden wir noch ein wenig im Delphi-Nebel stochern müssen, von dem ich leider auch nicht allzu viel verstehe. Schon gar nicht von den Compiler-Direktiven. Seltsam ist halt nur, dass die DLL-Aufrufe mit einem Delphi-Testprogramm funktionieren. Da wird dann gerne mit dem Finger auf mich (bzw. LabVIEW) gezeigt, seufz...

Trotzdem danke für die Anwort,
Bärbel

Also wenns mit dem UI Execution System dasselbe macht, dann ist es ganz sicher nicht TLS oder so was. Das UI Execution System ist in LabVIEW nähmlich ein ganz besonderes weil es nur aus einem Thread besteht der garantiert über die Lebensdauer des Prozesses immer derselbe bleibt.

Das sieht mir mehr aus wie wenn Du die DLL dynamisch lädst und wieder auslädst zwischen jedem Aufruf. Dazu fallen mir nur zwei Möglichkeiten ein im Moment.

1) Du lädst und unlädst die VIs selber dynamisch, etwa als Test Sequenzen innerhalb von Test Stand oder einer ähnlichen (selbstgestrickten) Test Sequenzumgebung.

2) Du verwendest das neue Call Library Feature um den Pfad zur DLL dynamisch als Parameter zur CLN anzugeben anstatt wie früher statisch im Konfigurationsdialog.

Oder Du machst in der DLL selber irgendwie was was die globalen Variablen immer wieder neu initialisiert.

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
  Fehler beim Schließen des VIs nach Delphi-DLL-Aufruf Bärbel 10 14.419 11.11.2013 11:44
Letzter Beitrag: andreaskoller
  Datenübergabe aus Delphi-DLL in LabVIEW kokisan2000 5 7.124 13.11.2009 19:42
Letzter Beitrag: Y-P
  LabVIEW DLL für Delphi erstellen hoho 6 8.647 12.01.2007 21:38
Letzter Beitrag: hoho
  Delphi DLL in LabVIEW brenner2305 17 17.624 15.11.2006 20:07
Letzter Beitrag: IchSelbst
  Einbinden einer Delphi-dll Svenni 6 8.457 17.10.2006 12:05
Letzter Beitrag: Svenni

Gehe zu: