![]() |
Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?
Der Titel ist etwas doof gewählt aber es ist im Prinzip einfach erklärt.
Ganz grob nur... und stark vereinfacht. - aller Code zum Initalisieren des Programms in FormCreate Vorteil: alles ist da, wo es nicht wirklich schaden anrichtet Nachteil: bis das Programm angezeigt wird dauert es eventuell länger - (viel) Code.... in WmFormVisible Vorteil: Programm ist schnell sichtbar, weil weniger in FormShow oder FormCreate ist Nachteil: man ist davon abhängig, dass das Formmular mindestens 1x sichtbar ist, damit alles geladen wird Gibt es da eine Art Zwischenlösung, womit man aus beiden Punkten etwas Gutes hat und so wenig wie möglich Nachteile? Beispiel für etwas, was ich aktuell in FormShow mache, was sonst nirgendwo anders möglich ist: Position und Größe des Hauptformulars setzen. Etwas was ich in FormCreate erledige: Sprache des Hauptformulars laden, Programmeinstellungen laden, Caption setzen, Variablen initialisieren. |
AW: Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?
Binde das in
Delphi-Quellcode:
unter Uses ein und Dein Programm liegt komplett im Arbeitsspeicher, das sollte alles beschleunigen *theoretisch (!)*
{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or IMAGE_FILE_NET_RUN_FROM_SWAP}
Das Laden wiederum verlängert sich da nun alles in Speicher geladen wird. |
AW: Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?
Zitat:
Zitat:
Gruß K-H |
AW: Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?
Alles was mit der GUI zusammenhängt muss logischerweise auch dort gemacht werden. Wenn du natürlich erst die Sprachpakete/Dateien von der Festplatte laden musst, dann kannst du den Teil evtl. noch in einen externen Thread auslagern. Die Umstellung der Captions passiert aber weiterhin im MainThread. Genau so wie das Setzen der Position.
Wenn du bspw. Daten bereits zu Beginn aus einer Datenbank lädst, dann kannst du auch das in einen externen Thread packen. Grundsätzlich sollte man eigentlich alle Aktionen die länger als eine gewisse Zeit in Anspruch nehmen in einen Thread auslagern. Dass das nicht immer möglich ist bzw. sehr viel Aufwand bedeutet weiß ich. Ich mache auch nicht jede Kleinigkeit in einem Thread. Aber gerade wenn es um Datenbankabfragen geht die etwas länger dauern können, wird das durchaus ausgelagert. Die Bedienbarkeit deines Programmes kannst du eigentlich auch nur dann gewährleisten, wenn der MainThread/GUIThread nur für die GUI zuständig ist und alles was mit dem abholen, verändern oder speichern von Daten zu tun hat in einem eigenen, vom MainThread unabhängigen, eigenen Thread erledigst. |
AW: Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?
Zitat:
Aller Code zum Initalisieren einer Form in dessen FormCreate, aber Code zum Initalisieren des Programms woanders hin |
AW: Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?
Hallo,
ich nehme immer FormActivate, dann sieht er Nutzer zumindestens, dass was passiert. Bei langsamem Aufbau (kann ja auch mal sein, langsame DB oder so) ev. noch ein "Bitte warten"-Fenster. Und da manchmal FormActivate mehrfach aufgerufen wird, kommt als erstes ein OnActivate:= nil; rein |
AW: Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?
Moin...:P
Zitat:
Zitat:
|
AW: Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?
Unsere Struktur sieht grob so aus:
Delphi-Quellcode:
Das Hauptformular registriert sich selbst mit einem interfacebasierten Wrapperobjekt als Anzeige. Ein Splashscreen wird bereits vorher durch eine der ersten eingebundenen Units angezeigt.
if TXyz.ExecuteCommandline then
Exit; Application.Initialize; try TXyz.Startup; try Application.MainFormOnTaskbar := True; Application.CreateForm(..., ...); Application.Run; finally TXyz.Shutdown; end; except on E: Exception do begin ... end; end; Das kann man natürlich auf viele Arten machen, aber das Grundprinzip ist, dass der Programmablauf nichts mit der Anzeige zu tun hat, sondern diese lediglich angesprochen wird (und umgekehrt die Anzeige lediglich Interfaces abruft um Events an die Businesslogik weiterzugeben usw.). |
AW: Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?
SplashScreen?
|
AW: Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?
Zitat:
Falls es eine Frage ist hilft ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:18 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