AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?
Thema durchsuchen
Ansicht
Themen-Optionen

Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?

Ein Thema von günni0 · begonnen am 21. Apr 2018 · letzter Beitrag vom 24. Apr 2018
Antwort Antwort
Seite 1 von 2  1 2      
günni0
(Gast)

n/a Beiträge
 
#1

Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?

  Alt 21. Apr 2018, 19:33
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.

Geändert von günni0 (21. Apr 2018 um 19:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?

  Alt 21. Apr 2018, 21:07
Binde das in {$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or IMAGE_FILE_NET_RUN_FROM_SWAP} unter Uses ein und Dein Programm liegt komplett im Arbeitsspeicher, das sollte alles beschleunigen *theoretisch (!)*
Das Laden wiederum verlängert sich da nun alles in Speicher geladen wird.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?

  Alt 21. Apr 2018, 23:07
Vorteil: alles ist da, wo es nicht wirklich schaden anrichtet
ungewöhnliche Formulierung

Nachteil: bis das Programm angezeigt wird dauert es eventuell länger
Man könnte ein Bild/Form anzeigen lassen und im Hintergrund durch ein oder zwei Threads die Initialisierungen Durchführen lassen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?

  Alt 22. Apr 2018, 00:23
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.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.447 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?

  Alt 23. Apr 2018, 10:30
- aller Code zum Initalisieren des Programms in FormCreate
Definitv nein.
Aller Code zum Initalisieren einer Form in dessen FormCreate, aber Code zum Initalisieren des Programms woanders hin
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?

  Alt 23. Apr 2018, 16:52
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
Heiko

Geändert von hoika (23. Apr 2018 um 17:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#7

AW: Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?

  Alt 23. Apr 2018, 17:21
Moin...

Zitat:
Bei langsamem Aufbau (kann ja auch mal sein, langsame DB oder so) ev. noch ein "Bitte warten"-Fenster.
Im OnActivate Datenbankzugriffe ausführen zu lassen oder Datenmengen zu laden... Das kann ggf. nach hinten losgehen.
Zitat:
Mit OnActivate können Sie bestimmte Operationen durchführen, sobald das Formular den Fokus erhält (wenn beispielsweise der Benutzer darauf klickt).
...das ist nicht immer gewollt.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.592 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?

  Alt 24. Apr 2018, 06:53
Unsere Struktur sieht grob so aus:
Delphi-Quellcode:
  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 Hauptformular registriert sich selbst mit einem interfacebasierten Wrapperobjekt als Anzeige. Ein Splashscreen wird bereits vorher durch eine der ersten eingebundenen Units angezeigt.

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.).
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?

  Alt 24. Apr 2018, 14:16
SplashScreen?
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Programm komplett laden, schnell anzeigen aber nicht von Events abhängig sein?

  Alt 24. Apr 2018, 16:53
SplashScreen?
Ist das eine Frage oder eher eine Aussage wie "Sowas macht man noch?".

Falls es eine Frage ist hilft das hier vielleicht.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 16:21 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