![]() |
Delphi-Version: 5
Anwendungsinitialisierung in Thread auslagern
Hallo!
In der .dpr gibt es ja bei größeren Projekten eine ganze Reihe von Application.CreateForm-Zeilen. Die ganzen Formulare die da erzeugt werden verzögern den Programmstart zum Teil erheblich. Da nicht alle Formulare sofort gebraucht werden, habe ich das Erzeugen aus der .dpr in die Haupt-Unit verlegt und führe es dort erst bei der Nachricht WM_AFTERSHOW (Formular fertig auf dem Bildschirm) aus. Dadurch startet das Projekt zwar erstmal blitzschnell, werkelt dann aber noch eine Weile nach. Entweder lasse ich es werkeln oder ich füge zwischen jedes CreateForm noch ein ProzessMessages, dann ist das Programm soweit arbeitsfähig. Das Problem dabei: Wird während der noch laufenden CreateForm-Schlange ein Formular geöffnet, dann werden keine weiteren CreateForm-Anweisungen ausgeführt. Daher mein Gedanke, das ganze Initialisierungsgeraffel in einen separaten Thread auszulagern. Was meint ihr dazu? Grüße Cody |
AW: Anwendungsinitialisierung in Thread auslagern
Müssen denn alle Formulare sofort geladen werden oder ginge das nicht auch bei Bedarf zur Laufzeit?
|
AW: Anwendungsinitialisierung in Thread auslagern
Im eigenen Thread wirds nicht so einfach, wegen der Synchronisierung.
Ich würde es an deiner Stelle mit dem Application.OnIdle-Event probieren ... da bleibt man im Application-Thread, weiß aber, das die App gerade nix zu tun hat. Sowas ähnliches hab ich letztens umgesetzt und es funktioniert sehr gut. |
AW: Anwendungsinitialisierung in Thread auslagern
Ich würde die Forms (wie DeddyH sagt) wenn möglich erst zur Laufzeit erzeugen:
Delphi-Quellcode:
type
TFormIrgendwas = class(TForm) //... public class function Execute: Boolean; end; ... ... class function TFormIrgendwas.Execute: Boolean; begin with TFormIrgendwas.Create(nil) do begin Result := ShowModal = mrOK; Free; end; end; ... procedure TForm1.Button1Click(Sender: TObject); begin if TFormirgendwas.Execute then ShowMessage('Fenster mit "OK" geschlossen') else ShowMessage('Fenster mit "Abbrechen" geschlossen'); end; |
AW: Anwendungsinitialisierung in Thread auslagern
class function wird Delphi 7 wohl nicht nehmen wollen IIRC, aber das geht ja auch ganz konservativ.
Delphi-Quellcode:
if not Assigned(FormBla) then
FormBla := TFormBla.Create(Application); FormBla.Show; |
AW: Anwendungsinitialisierung in Thread auslagern
Zitat:
Aber wie schon gesagt: Keine Formular auf "Halte" anlegen. Auch deine verbrauchten GDI-Ressourcen werden es dir danken. |
AW: Anwendungsinitialisierung in Thread auslagern
Zitat:
Das ist imho die richtigste :-) Lösung. |
AW: Anwendungsinitialisierung in Thread auslagern
Liste der Anhänge anzeigen (Anzahl: 2)
Die Idee (mit dem OnIdle) ist an sich ganz lustig.
Deswegen hab ich mal ne kleine Unit gebaut. Die einfach im Projekt einbinden und alle
Delphi-Quellcode:
durch
Application.CreateForm
Delphi-Quellcode:
ersetzen.
Application_CreateForm
Mich würde mal interessieren, ob dir das weiterhilft. |
AW: Anwendungsinitialisierung in Thread auslagern
Zitat:
Bernhard hat schon vollkommen recht: Die sauberste Lösung wäre die dynamische Erzeugung der Formulare bei Bedarf. Leider kann man gewachsene Projekte nur recht schwer auf soetwas umstellen. Bei neuen Projekten werde ich das aber in Zukunft so machen. Allgemein gesprochen: Das ganze Konstrukt der Delphi-IDE-Formular-Assistenten erzeugt nicht gerade effizienten Code. Per Default wird jedes einzelne Formular mit seinem gesamten GDI-Gerümpel beim Programmstart geladen. Das kann man bei meinem jetzigen "Problemkind" sehr schön sehen. Ohne die asynchrone Formularerzeugung dauert der Programmstart 8 Sekunden. Mit async. dagegen nur 0,4 bis das MainForm steht. In beiden Fällen kann man eine schöne ansteigende Kurve im GDI-Monitor beobachten. Würde man die ganzen Formulare nur erzeugen wenn man sie braucht und dann wieder freigeben, ich glaub ich könnte 80% Speicherbedarf einsparen. Aber wie gesagt, das geht mit vertretbarem Aufwand nur bei neuen Projekten. Grüße Cody |
AW: Anwendungsinitialisierung in Thread auslagern
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:53 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