AGB  ·  Datenschutz  ·  Impressum  







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

Anwendungsinitialisierung in Thread auslagern

Ein Thema von Codehunter · begonnen am 17. Aug 2011 · letzter Beitrag vom 17. Aug 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

Anwendungsinitialisierung in Thread auslagern

  Alt 17. Aug 2011, 09:39
Delphi-Version: 5
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Anwendungsinitialisierung in Thread auslagern

  Alt 17. Aug 2011, 09:44
Müssen denn alle Formulare sofort geladen werden oder ginge das nicht auch bei Bedarf zur Laufzeit?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Anwendungsinitialisierung in Thread auslagern

  Alt 17. Aug 2011, 09:45
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.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Anwendungsinitialisierung in Thread auslagern

  Alt 17. Aug 2011, 09:51
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;
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Anwendungsinitialisierung in Thread auslagern

  Alt 17. Aug 2011, 09:54
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Anwendungsinitialisierung in Thread auslagern

  Alt 17. Aug 2011, 09:55
Im eigenen Thread wirds nicht so einfach, wegen der Synchronisierung.
Sag wir lieber was die Formulareerstellung betrifft: Es ist unmöglich.

Aber wie schon gesagt: Keine Formular auf "Halte" anlegen. Auch deine verbrauchten GDI-Ressourcen werden es dir danken.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#7

AW: Anwendungsinitialisierung in Thread auslagern

  Alt 17. Aug 2011, 09:57
Ich würde die Forms (wie DeddyH sagt) wenn möglich erst zur Laufzeit erzeugen:
... bzw. in dem Moment, wenn man sie braucht.
Das ist imho die richtigste Lösung.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#8

AW: Anwendungsinitialisierung in Thread auslagern

  Alt 17. Aug 2011, 10:31
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 Application.CreateForm durch Application_CreateForm ersetzen.

Mich würde mal interessieren, ob dir das weiterhilft.
Angehängte Dateien
Dateityp: pas uDelayedFormCreate.pas (1,8 KB, 13x aufgerufen)
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)

Geändert von chaosben (17. Aug 2011 um 10:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Anwendungsinitialisierung in Thread auslagern

  Alt 17. Aug 2011, 12:09
Deswegen hab ich mal ne kleine Unit gebaut.
Also die Idee mit dem OnIdle ist wirklich nicht schlecht. Mit der Konstruktion wird der ganze Stapel von anhängigen Formularen asynchron erzeugt und auch bei geöffneten Formularen fortgesetzt.

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
  Mit Zitat antworten Zitat
Benutzerbild von FaTaLGuiLLoTiNe
FaTaLGuiLLoTiNe

Registriert seit: 3. Jul 2004
Ort: NRW
55 Beiträge
 
Delphi XE Enterprise
 
#10

AW: Anwendungsinitialisierung in Thread auslagern

  Alt 17. Aug 2011, 13:01
class function wird Delphi 7 wohl nicht nehmen wollen IIRC
Klassenmethoden sind auch in D7 möglich, nur Klassenattribute gibt's da noch nicht.
Christian
<< FaTaLGuiLLoTiNe >>
Rhinoceroses don't play games!
  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 20:49 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