Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Wie Funktion einer DLL hundertfach hintereinander aufruf

  Alt 9. Okt 2005, 19:11
Hi,

also das deine Funktion so langsam ist, dürfte wohl damit zusammenhängen, dass du die jedes mal neu lädst. Das kostet natürlich Zeit, bedingt aber natürlich auch den Unterschied zwischen dynamischem und statischem Linken.
Wie auch immer, der Speicherbedarf ist halt eine andere Sache.

Lädst du jetzt eigentlich 200 mal die Dll und rufst dann die Funktion auf (also auch verschiedene dlls) oder lädst du einmal und kommt dann nach 200 Funktionsaufrufen das Problem?

Letzteres spricht natürlich für allozierten Speicher in der Funktion (und in ihren Funktionsaufrufen), der nicht freigegeben wird. Einerseits natürlich direkt in der Funktion, wenn du etwas erzeugst, musst du es explizit wieder freigeben, aber halt auch bei der Übergabe von Parametern musst du aufpassen. Wenn du die Parameter jedes mal neu erzeugst ohne die alten vorher freizugeben, z.B.:

Delphi-Quellcode:
function doFoo;
begin
  self.myBitmap := TBitmap.Create;
  // assign sth. to myBitmap
  ....
  myFunction(self.myBitmap)
end;
Dann hast du zwar immer genau die erwartete Bitmap an myFunction übergeben, aber jedes TBitmap.Create legt eine neue Bitmap an. Die Zuweisung ist dabei nur eine Zuweisung der Referenz self.myBitmap auf eine Bitmap, was mit der "Alten" passiert, auf die myBitmap nur gezeigt hat, ist Delphi egal. Die müsstest du mit einem self.myBitmap.Free natürlich freigeben.
Sorry wenn du das alles schon weißt und dich jetzt gelangweilt fühlst, aber kann man schnell mal drin haben.
Dann natürlich dynamische Arrays mit finalize(Array) ebenso freigeben.

Und zu guter letzt kommt natürlich noch eins in Frage, du benutzt loadLibrary, ähnlich wie gerade in doFoo erklärt, solltest du auch hier das Handle freigeben und deine Funktion um ein FreeLibrary erweitern.

Delphi-Quellcode:
TMainform.button1click(Sender: TObject);
begin
  if OutputDLL <> nil then
    begin
      if not FreeLibrary(OutputDLL) then
        begin
          // Fehler beim freigeben der DLL
          raise ...
        end; // if not FreeLibrary(OutputDLL)
    end; // if OutputDLL <> nil
  OutputDLL :=LoadLibrary(PChar('c:\meinplugin.dll'));
  @DLLSenddata := GetProcAddress(OutputDLL,'DLLSenddata');
end;
  Mit Zitat antworten Zitat