2012-03-28 16 views
0

Zum Erstellen und Anzeigen eines Formulars dauert 10 Sekunden, und ich möchte den Prozess verkürzen.Optimierung der Erstellung eines Formulars

Seitens die

Inherited Create(AOwner); 

Welche 2 Sekunden aus der Gesamtlaufzeit erfolgt.

Gibt es eine Möglichkeit, die Eltern erstellen, die das Delphi TForm ist? Oder Sie wissen, was die Gründe für die Zunahme der Zeit in der

Inherited Create(AOwner); 

telefonieren?

Update: Nun, ich habe nicht für 18 Kommentare und 3 Antwort erwartet: D danke Ihnen allen für Ihre Antwort.

bei dem aktuellen Zustand habe ich ein paar Profile, die rund um hier, und nicht zu einer echten Codezeile führen, die am Code war, war es hauptsächlich Kernel-Aufrufe oder Systemaufrufe.

so nach der Delphi XE2 zu kaufen, die mit AQTime kommt, im Versuch, das Projekt zu Delphi XE2, zu aktualisieren, die jetzt ein paar Tage dauern. (BIG PROJECT)

krank Informationen hinzufügen, wie ich die Informationen aus der get Profiler.

BTW, außerhalb einer Windows-Server-Domäne, macht die Aktion doppelt so viel langsamer. als ein Innencomputer läuft unter 5 Sekunden. Das ist viel besser, aber immer noch langsam.

Update2: Kompilieren und Ausführen mit Delphi XE2 verbesserte fast 20% in der Zeitpräferenz gegenüber Delphi 2009. AQTime lieferte keine nützlichen Informationen.

update3: links xe2, nicht stabil. ging zurück zu delphi 2009 dort versuchte in Anfang des Konstruktor

SendMessage(application.Handle, WM_SETREDRAW, 0, 0); 

und am Ende des Konstruktor

SendMessage(application.Handle, WM_SETREDRAW, -1, 0); 
    form.Repaint; 

0,1 Sekunden verringert.

+7

Wenn ich das mache, wird das Formular sofort erstellt. Offensichtlich unterscheiden sich Code und Code. Ich weiß, was mein Code tut, aber ich weiß nicht, was dein Code ist. –

+1

@none Wenn Sie viele, und ich meine ** viele ** visuelle Komponenten auf dem Formular haben, könnte es erheblich länger dauern, bis Ihre Anwendung die Formulare auf Basis der * .dfm-Ressource (n) erstellt hat. In diesem Fall könnte das Erstellen der Komponenten mit Code die Geschwindigkeit verbessern, aber es wäre ein Overkill. Verwenden Sie die Vererbung von mehreren Formularen? ein paar Code, was genau in OnCreate Ihres Formulars passiert, würde helfen, ich nehme an, dass es aufgrund einer Datenbankverbindung offen bleibt? – ComputerSaysNo

+0

@DorinDuminica Ja, das Formular enthält mehr als hundert visuelle Komponenten. Der Constractor selbst ist riesig und ich versuche, die Probleme einzeln zu isolieren. – none

Antwort

9

Aus Erfahrung zu sehen, Geschäftsformulare missbräuchlich mit Komponenten verpackt:

  1. DataBase Aktivität: Sie haben DB-Komponenten, die aktiv sind und erfordern DB öffnen und/oder Abrufen von Daten. Das Offensichtliche ist, wenn Ihr Formular DBConnections oder DataSets zur Entwurfszeit aktiv enthält, oder, hinterhältig, Sie DB-aware Komponenten (wie TDBEdit) mit einigen DataSources irgendwo anders (in einem DataModule) verknüpft haben und diese Active bleiben.
    Abhilfe: Legen Sie alle Ihre DataSets und Verbindungen in Active=False zur Entwurfszeit und aktivieren, wenn zuerst benötigt.

  2. Lange OnCreate Ereignisse (oder Ketten nennen): Sie haben zu viel Code oder zu langsam in Ihren Komponenten OnCreate Event-Handler (oder sie rufen/Trigger andere, die langsam/lang). Am häufigsten sind Dateioperationen wie der Umgang mit riesigen INI-Dateien, schwerem XML-Speicher oder Excel-Tabellen.
    Abhilfe: Jagen Sie sie und versuchen Sie zu verschieben, bis Sie sie tatsächlich brauchen.

  3. Unnötige Event-Handler-Aufrufe: Die Ereignisse werden während des Create-Vorgangs mehrere Male ohne nützlichen Grund ausgelöst (und rufen sich gegenseitig häufig auf). Verwenden Sie einen Profiler zum Erkennen und Zählen.
    Abhilfe: Deaktivieren Sie die Ereignisse, bis sie nützlich sind.

Last resort Trick: Wenn Sie es nicht schneller, die Wahrnehmung der Benutzer ändern.
Setzen Sie einen schnell zu öffnenden Begrüßungsbildschirm mit etwas zum Lesen oder Lesen, das die Aufmerksamkeit der Benutzer für etwa die gleiche Zeit wie Ihre MainForm-Eröffnung erregen kann.

2

Verwenden Sie einen Profiler namens AQTime und finden Sie heraus, was langsam ist. Niemand hier kann erraten, was du tust, das ist langsam für dich.

+0

Ich werde das tun, danke. – none

1

Ich lese Sie haben viele viele Komponenten auf dem Formular. Meine Vermutung ist also, dass die Initialisierung all dieser Komponenten die Zeit in Anspruch nimmt und nicht die Erstellung des Formulars (was normalerweise ein paar Millisekunden dauert).

Zunächst einmal: Vielleicht wissen Sie das bereits, aber wenn nicht, verwenden Sie einen Profiler, um festzustellen, welche Komponenten auf Ihrem Formular die Verzögerung geben. Werden Tabellenfüller nur einmal oder mehrmals aufgerufen.

Wenn die meisten dieser Komponenten Steuerelemente sind, sollten Sie den Code wahrscheinlich umgestalten und einige Frames für jedes Teil erstellen. Immer wenn ein Teil für den ersten sichtbar wird, können Sie den benötigten Rahmen gerade rechtzeitig erstellen. Dies funktioniert am besten, wenn Sie einen Tab oder etwas ähnliches haben, wenn nicht alles gleichzeitig sichtbar ist.

Wenn die meisten Komponenten nicht sichtbar sind, können Sie sie nur rechtzeitig aktivieren und dynamisch erstellen, wenn sie keine Eigenschaft zum Aktivieren/Deaktivieren haben.

Wenn einige Abfragen Daten (aus Datenbank oder Datei oder was auch immer) einlesen müssen, versuchen Sie, die Daten in einem anderen Thread zu laden und einige Teile des Formulars auszublenden, bis die Daten vorhanden sind. Brauchen Sie sofort alle Daten usw.

Aber trotzdem: am wichtigsten: wissen Sie, was die ganze Zeit verbraucht.

Verwandte Themen