Autor Beitrag
CarstenB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win XP, Win 7, FreeBSD
Delphi 2007 Prof., VS 2003
BeitragVerfasst: Mi 19.03.14 18:23 
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.


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Do 20.03.2014 um 11:43
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 19.03.14 18:31 
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 19.03.14 23:49 
user profile iconCarstenB hat folgendes geschrieben Zum zitierten Posting springen:
Das Problem ist jetzt, dass damit die Message-Queue der Haupt-Applikation nicht mehr greift.
Da ist dann erst einmal die Frage was dabei gemacht wird, dass das ein Problem ist?
Wenn du mit visuellen Komponenten etwas machst, geht das ja ohnehin nur im Hauptthread.
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 20.03.14 04:25 
user profile iconCarstenB hat folgendes geschrieben Zum zitierten Posting springen:
Mit wachsender Komplexität einer Applikation müssen ein Haufen DLLs geladen werden, was sich zur Laufzeit durch unschöne Verzögerungen bemerkbar macht.

Zwei Möglichkeiten:

1. DLLs nicht alle auf einmal, sondern dynamisch laden, wenn sie benötigt werden. Hat den Nachteil, daß das Aufrufen einer entsprechenden Funktionalität länger dauert.

2. Splash-Screen anlegen und alle DLLs auf einmal beim Programmstart laden, ggf. mit Anzeige des Ladevorgangs, damit der Anwender beruhigt ist.

Das Laden in einem Thread birgt die Gefahr, daß der Anwender Funktionalitäten der Applikation abrufen möchte, die eine noch nicht geladene DLL benötigen. Daher würde ich dem Anwender nicht gestatten, auf die Funktionalität des Programms zuzugreifen, bevor das Programm vollständig zur Verfügung steht.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 20.03.14 07:00 
user profile iconPerlsau hat folgendes geschrieben Zum zitierten Posting springen:
Das Laden in einem Thread birgt die Gefahr, daß der Anwender Funktionalitäten der Applikation abrufen möchte, die eine noch nicht geladene DLL benötigen. Daher würde ich dem Anwender nicht gestatten, auf die Funktionalität des Programms zuzugreifen, bevor das Programm vollständig zur Verfügung steht.
Oder man macht es richtig und erstellt einen Pool, der entweder den schon geladenen DLL-Wrapper liefert, wenn dieser benötigt wird, oder das Laden priorisiert, wenn die DLL noch nicht durch den Thread geladen wurde.

So habe ich das sowohl mit DLLs als auch mit Datenbanken schon umgesetzt, auch nachträglich in einem schon bestehenden Projekt, das geht eigentlich relativ einfach, ist aber natürlich mit einigem Aufwand verbunden.
CarstenB Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19

Win XP, Win 7, FreeBSD
Delphi 2007 Prof., VS 2003
BeitragVerfasst: Do 20.03.14 11:50 
In den DLLs laufen selbst auch wieder Threads für Kommunikation, Datenaufbereitung, etc. Zur Kommunikation mit dem Hauptprogramm und VCL-Synchronisierung werden neben Callback-Funktionen auch Messages verwendet.

Dynamisches Laden ist der Status Quo, was aber eben an einigen Stellen zu den genannten Verzögerungen führt. Durch das "Vorladen" ist dieser Effekt recht gut in den Griff zu bekommen.
Welche DLLs bereits geladen sind ist in der Komponente bekannt. Diese enthält einen Pool, wie von jaenicke erwähnt - für aufrufende Funktionen gibt es kein Problem.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 20.03.14 12:12 
Das hört sich relativ ähnlich an zu dem was wir bei solchen Fällen machen.

Mit den Messages hatten wir da aber bisher keine Probleme. Das einzige Problem war, dass Synchronize in den DLLs so nicht ging, aber das ließ sich durch Aufrufe von CheckSynchronize über eine exportierte Funktion der DLL, die im Hauptprogramm aus OnIdle heraus aufgerufen wird, beheben.