Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   DLLs in Hintergrund-Thread laden (https://www.delphipraxis.net/179609-dlls-hintergrund-thread-laden.html)

CarstenB 19. Mär 2014 16:22

DLLs in Hintergrund-Thread laden
 
Hallo,

ich habe folgendes Problem.

Mit wachsender Komplexität einer Applikation müssen ein Haufen DLLs geladen werden, was sich zur Laufzeit durch unschöne Verzögerungen bemerkbar macht.
Ich habe nun verschiedene Ansätze probiert, u.A. die DLLs in einem Hintergrundthread (LoadLibrary) vorzubereiten.

Das Problem ist jetzt, dass damit die Message-Queue der Haupt-Applikation nicht mehr greift. Eine zusätzliche Message-Queue möchte ich eigentlich vermeiden.

Gibt's einen Ausweg? :)

MfG.

Perlsau 19. Mär 2014 16:32

AW: DLLs in Hintergrund-Thread laden
 
Crosspost

himitsu 19. Mär 2014 16:38

AW: DLLs in Hintergrund-Thread laden
 
Wenn der gesamte StartCode der DLL (inkl. der Initialization, Finalization, Class-Constructor und Class-Destructor) threadsave ist und die darin erzeugten Komponenten nicht an einen Thread gebunden sind (wie die Fenster/Komponenten der WinAPI), dann könnte man die DLL in einem Thread laden.

Wenn nicht, dann nicht.
Und bei dir klingt es danach, als wenn nicht.

Man könnte aber innerhalb der DLLs einige threadsichere und "langwierige" Initialisierungsprozeduren in einem anderem Thread durchführen, wenn diese nicht sofort benötigt werden.

Furtbichler 19. Mär 2014 17:24

AW: DLLs in Hintergrund-Thread laden
 
Wie wäre es mit lazy load, also die Prozeduren einer DLL in einer Klasse/Unit kapseln und die Prozeduren indirekt aufrufen, d.h. für jede DLL-Prozedur folgendes Pattern programmieren:
Delphi-Quellcode:
Var
  myDLLProcPtr : Procedure (foo : TBar);

Procedure LazyLoadLibary;
Begin
  if hLibrary<>0then exit;
  hLibrary := LoadLibrary('TheDLL.DLL');
  myDLLProcPtr := GetProcPtr(hLibary,'MyProcedure');
  ...
End;

Procedure MyDLLProc (foo : TBar);
Begin
  LazyLoadLibrary;
  myDLLProcPtr(foo);
End;
DLLs werden erst dann geladen, wenn sie benötigt werden. Zeitkritische Libraries können explizit geladen werden, auch über Threads. Dann hast Du das beste aus beiden Welten: Du lädst nur Libraries, die Du benötigst und die, die kritisch sind, werden am Anfang in Threads geladen.

himitsu 19. Mär 2014 17:48

AW: DLLs in Hintergrund-Thread laden
 
Neuere Delphi-Compiler (mindestens seit XE3, aber vermutlich schon bissl früher) haben direkt den "Linker Support for Delay-Loaded" implementiert.

Delphi-Quellcode:
function GetSomething: Integer;
external 'somelibrary.dll' delayed;
Die DLL wird dabei erst dann automatisch geladen, wenn eine der importierten Methoden aufgerufen wird.
(wird eine Methode ohne Delayed importiert, dann wird natürlich dennoch beim Programmstart schon geladen)

Im Hintergrund wird der selbe Code verwendet, welchen auch die C++-Compiler benutzen, wenn man dort via Delayed importiert. (der Code wurde von Microsoft so bereitgestellt)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz