AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLLs in Hintergrund-Thread laden

Ein Thema von CarstenB · begonnen am 19. Mär 2014 · letzter Beitrag vom 19. Mär 2014
Antwort Antwort
CarstenB

Registriert seit: 15. Jun 2007
24 Beiträge
 
Delphi XE5 Professional
 
#1

DLLs in Hintergrund-Thread laden

  Alt 19. Mär 2014, 17:22
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.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#2

AW: DLLs in Hintergrund-Thread laden

  Alt 19. Mär 2014, 17:32
Crosspost
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.048 Beiträge
 
Delphi 12 Athens
 
#3

AW: DLLs in Hintergrund-Thread laden

  Alt 19. Mär 2014, 17:38
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: DLLs in Hintergrund-Thread laden

  Alt 19. Mär 2014, 18:24
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.048 Beiträge
 
Delphi 12 Athens
 
#5

AW: DLLs in Hintergrund-Thread laden

  Alt 19. Mär 2014, 18:48
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (19. Mär 2014 um 18:51 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 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