Hallo,
ein Anwender stört sich daran, dass mein Programm langsam startet. Mich hat es auch schon gestört. Es gibt viele kleinere Aktionen und einen größeren Block mit 30 Sekunden. Mein Programm ist eine Windows-Anwendung, XE-2,
MDI und Expressbars von DevExpress.
Durch debuggen stellte ich fest, dass die Zeit in der
unit System.Classes hier gebraucht wird:
Delphi-Quellcode:
procedure NotifyGlobalLoading;
var
I: Integer;
G: TList;
begin
G := GlobalLoaded; // performance: eliminate repeated trips through TLS lookup
for I := 0 to G.Count - 1 do
TComponent(G[I]).Loaded;
end;
G.Count ist 726. Das erscheint recht viel, dürfte aber der Anzahl der Komponenten in meinem Programm entsprechen. Ich sehe derzeit auch keine Möglichkeit einen Teil auszulagern, weil DevExpress das Menüband u.a. beim Start ja auch lädt.
Einige Fälle hab eich durchgesteppt. Irgendwann kommt man in procedure TComponent.Loaded; an wo dann Exclude(FComponentState, csLoading); gemacht wird.
Ist jemand ein Problem bekannt und/oder eine Idee wie man das verbessern kann?
Naja, Loaded wird von vielen Komponenten überschrieben um Initialisierungsaufgaben zu erledigen, z. B. bei einer aktiven database connection-Komponente die Verbindung zur Datenbank herzustellen, oder Daten aus einer Datei oder Resource zu laden, etc. Das kann dann dauern, besonders wenn die Aktion erst nach einem Timeout fehlschlägt...
726 Komponenten auf
einem Form sind allerdings auch reichlich viel, da solltest Du mal über eine bessere Aufteilung nachdenken und, wenn möglich, Teile des UI erst erzeugen wenn sie auch wirklich gebraucht werden. Stichwort Frames...