Einzelnen Beitrag anzeigen

Benutzerbild von christian.noeding
christian.noeding

Registriert seit: 26. Mai 2005
Ort: Knw.-Remsfeld
119 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Wie Funktion einer DLL hundertfach hintereinander aufruf

  Alt 9. Okt 2005, 21:00
Hmm, erst mal danke für die Antwort...

ich lade die DLL (zur Laufzeit) nur einmal und rufe dann die Funktion nur sehr oft hintereinander auf. In der DLL-Funktion "DLLSenddata" wird (leider) überhaupt nichts erzeugt, was ich freigeben könnte. Ich rechne mit den Parametern nur ein bisschen rum, mache ein paar Bitverschiebungen und schiebe das ganze dann über den Com-Port mit einer Comport-Komponente raus.


Ich habe bisher auch nicht versucht, die DLL einmal statisch beim Programmstart zu laden... ich bin davon ausgegangen, dass die DLLs beim Laden zur Laufzeit sich nicht anders verhalten, wenn man sie nur einmal läd.


Also nochmal zusammen gefasst:
Delphi-Quellcode:
    OutputDLL := LoadLibrary(PChar('c:\plugin.dll'));
    @xDLLSenddata := GetProcAddress(OutputDLL, 'DLLSenddata');
und dann eben zum Beispiel über ne Scrollbar hintereinander (mit sich ändernden Parametern):

Delphi-Quellcode:
for i:=1 to 127 do
    xDLLSenddata(i,0,scrollbar1.position,1,0);

und mit jedem Ausführen der DLL-Funktion wird der Durchlauf immer langsamer :-/ das ist bei der Funktion im Exe-Code nicht passiert. Es muss also irgendwas im Speicher passieren. Eine nicht durchgeführte Freigabe, wie du sagst, klingt einleuchtend, nur was?


Hier mal der komplette Code der DLL:

Delphi-Quellcode:
library pc_dimmer_com;

uses
  Forms,
  SysUtils,
  Classes,
  Windows,
  configfrm in 'configfrm.pas{Config},
  aboutfrm in 'aboutfrm.pas{About};

{$R *.res}

function DLLGetName:PChar;stdcall;
begin
  Result := PChar('230V 128 Kanal PC_DIMMER');
end;

function DLLGetVersion:PChar;stdcall;
begin
  Result := PChar('v1.0');
end;

procedure DLLConfigure;stdcall;
var
  dllForm: TForm;
begin
  dllForm :=TConfig.Create(Application);
  try
    dllForm.ShowModal;
  finally
    dllForm.Release;
  end;
end;

procedure DLLAbout;stdcall;
var
  dllForm: TForm;
begin
  dllForm :=TAbout.Create(Application);
  try
    dllForm.ShowModal;
  finally
    dllForm.Release;
  end;
end;

procedure DLLSenddata(address:integer; ftime:longint; level,st,fadetime_ms:integer);stdcall;
var
  b:byte;
  t3,t2,t1:byte;
  rs232frame:array[0..5] of Byte;
begin
// Routine für COM1 bis COM16
// im Puffer alles auf 0 setzen
FillChar(rs232frame, SizeOf(rs232frame), 0);

  dec(address);
  b:=address;
  b:=b or $80; {erste byte high für Synchronisation}
  rs232frame[0]:=b; {erste Byte in Puffer schreiben}

//Steps in Byte 2 schreiben
  dec(st);
  b:=0;
  b:=b or st;
  rs232frame[1]:=b; {zweite Byte in Puffer schreiben}

// Fadezeiten in Byte 3..5 senden
  t1:=(lo(ftime) and $7F);
  ftime:=ftime shr 7;
  t2:=(lo(ftime) and $7F);
  ftime:=ftime shr 7;
  t3:=(lo(ftime) and $7F);
  rs232frame[2]:=t3; {dritte Byte in Puffer schreiben}
  rs232frame[3]:=t2; {vierte Byte in Puffer schreiben}
  rs232frame[4]:=t1; {fünfte Byte in Puffer schreiben}

// Endwert im Byte 6 senden
  b:=level and $7F;
  rs232frame[5]:=b; {sechste Byte in Puffer schreiben}
  Application.CreateForm(TConfig, Config);
  config.comport.SendData(@rs232frame,6);
end;

exports
  DLLGetVersion,
  DLLGetName,
  DLLConfigure,
  DLLAbout,
  DLLSenddata;

begin
end.


dieser Sourceschnippsel oben sollte direkt kompilierbar sein, wenn man die configfrm und aboutfrm rausnimmt... danke für jeden weiteren Tipp


schönen Abend noch,
Christian!


PS: keine Ahnung, obs was bringt, aber ich habe mal die fertig kompilierte DLL mit in den Anhang gehängt...
Angehängte Dateien
Dateityp: zip pc_dimmer_com_326.zip (261,4 KB, 9x aufgerufen)
Christian Nöding
  Mit Zitat antworten Zitat