Seite 1 von 1
Ausführen einer DLL-Funktion
Verfasst: 18.05.2005 16:35
von Lebostein
Nur eine kurze Frage: CallFunctionFast() ist nur dann schneller, wenn ich die Funktionsadresse vorher und einmalig ermittle, oder? Wenn ich CallFunctionFast() in Verbindung mit IsFunction() verwende (1. Beispiel), dürfte es genauso schnell sein wie CallFunction() direkt (2. Beispiel), da ja in beiden Fällen die DLL immer wieder durchsucht wird... oder irre ich mich?
Code: Alles auswählen
Procedure MeineFunktion(param1, param2)
FunctionID = IsFunction(#Library, "MeineFunktion")
ProcedureReturn CallFunctionFast(FunctionID, param1, param2)
EndProcedure
Procedure MeineFunktion(param1, param2)
ProcedureReturn CallFunction(#Library, "MeineFunktion", param1, param2)
EndProcedure
Verfasst: 18.05.2005 17:21
von ts-soft
Normalerweise nur dann, wenn du die FunktionID zwischenspeicherst. Wenn Du nicht alle FunktionID's beim öffnen der DLL ermitteln möchtest, kannst Du es auch so machen:
Code: Alles auswählen
Procedure MeineFunktion(param1, param2)
Static FunctionID
If FunctionID = 0 : FunctionID = IsFunction(#Library, "MeineFunktion") : EndIf
ProcedureReturn CallFunctionFast(FunctionID, param1, param2)
EndProcedure
Nur Sinnvoll, wenn die Funktion mehrmals gebraucht wird
Verfasst: 18.05.2005 18:46
von nicolaus
normalerweise machst du das so das du dir für jede function der dll die du verwenden willst eine avriable anlegst.
dann rufst du bei der initialisierung deines programmes einfach alle funktionen der dll mit IsFunction() auf (natürlich erst OpenLibrary() um die dll zu öffnen) und speicherst deren speicheradresse in die angelegeten variablen.
Code: Alles auswählen
Procedure InitDLLFunctions()
If OpenLibrary(0,"meine.dll")
function_1 = IsFunction(0,"Function_1")
endif
Endprocedure
na ja un nun kannst du mit deinen variablen in denen du ja jetzt die adressen der functionen deiner dll hast mit CallFanctionFast() deine funktionen aus der dll in alle proceduren deines programmes aufrufen ohne das immer wieder in der dll nach der function gesucht werden muß.
hoffe das die erklärung halbwegs verständlich war.
Gruß Nico
Verfasst: 19.05.2005 11:24
von Lebostein
Danke für eure Antworten.
@ts-soft: Sehr elegante Lösung, so werd ich's machen, Danke!
Verfasst: 19.05.2005 11:29
von traumatic
Lebostein hat geschrieben:@ts-soft: Sehr elegante Lösung, so werd ich's machen, Danke!
Ging es Dir nicht um Geschwindigkeit?
Dann ist der Ansatz - noch eine weitere Funktion drumherum
zu bauen - mit Erlaub keine wirklich gute Lösung.
Verfasst: 19.05.2005 11:41
von ts-soft
traumatic hat geschrieben:Lebostein hat geschrieben:@ts-soft: Sehr elegante Lösung, so werd ich's machen, Danke!
Ging es Dir nicht um Geschwindigkeit?
Dann ist der Ansatz - noch eine weitere Funktion drumherum
zu bauen - mit Erlaub keine wirklich gute Lösung.
Du hast ja Recht, es ist auf jedenfall besser einmalig alle Funktionsadressen zu ermitteln und diese in globalen Variablen zu speichern. Da die Fehlerwahrscheinlichkeit mit vielen globalen Variablen größer wird, bietet es sich an, mit TailBite einen Wrapper zu erstellen, dann sind die globalen Variablen nur noch in der Lib global und nicht im Programm, das diese verwendet.
Meine Lösung von oben ist nur eine Notlösung, wobei ich davon ausgegangen bin, das diese If Abfrage schneller ist, als die Suche der Funktionsadresse.
Verfasst: 19.05.2005 11:50
von traumatic
Ich wollte ja auch gar nichts gegen Deine Lösung sagen, nur an
Geschwindigkeit gewinnt mal halt nicht gerade.

Verfasst: 19.05.2005 12:02
von ts-soft
traumatic hat geschrieben:Ich wollte ja auch gar nichts gegen Deine Lösung sagen, nur an
Geschwindigkeit gewinnt mal halt nicht gerade.

Sollte aber schneller als diese:
Code: Alles auswählen
Procedure MeineFunktion(param1, param2)
FunctionID = IsFunction(#Library, "MeineFunktion")
ProcedureReturn CallFunctionFast(FunctionID, param1, param2)
EndProcedure
sein. Habs ich aber nicht getestet.

Verfasst: 19.05.2005 13:15
von Lebostein
Mir ging es nur darum, nicht bei jedem Funktionsaufruf die DLL zu durchsuchen bzw. wenn dann nur einmalig. Und das funktioniert ja mit dem Code ordentlich.
Verfasst: 19.05.2005 15:57
von nicolaus
dann kannst du das auch so machen wie ich es geschrieben hatte (mach ich immer so) das du beim programmstart (initialisierung) die global angelegeten variablen mit IsFunction() "füllst" und somit im restlichen code deines programmes nur noch die variablen (in denen ja die adresse der function aus der dll steht) bei CallFunctionFast() verwenden mußt. das ist denke ich schon mal wesentlich schneller gerade wenn du ne dll mit vielen functionen hast und diese auch nutz.
gruß nico