![]() |
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. |
AW: DLLs in Hintergrund-Thread laden
|
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. |
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:
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.
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; |
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:
Die DLL wird dabei erst dann automatisch geladen, wenn eine der importierten Methoden aufgerufen wird.
function GetSomething: Integer;
external 'somelibrary.dll' delayed; (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 05:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz