Otworzenie wielu formularzy a obciążenie systemu Delphi

2016-05-01 12:28
0

Załóżmy że mam utworzonych 30 form lub więcej


   Application.CreateForm(TForm1, Form1);
   Application.CreateForm(TForm2, Form2);
   Application.CreateForm(TForm3, Form3);
   Application.CreateForm(TForm5, Form5);
   Application.CreateForm(TForm6, Form6);
   Application.CreateForm(TForm7, Form7);
   Application.CreateForm(TForm8, Form8);
   Application.CreateForm(TForm9, Form9);
   ....

Jak to wpływa na obciązenie samej aplikacji.
Czy każda z tych form jest cały czas jest uruchomiona i schowana przez hide i obsługiwana przez program.
Czy nie ma to najmniejszego wpływu na działanie i obciążenie programu.

Pozostało 580 znaków

2016-05-01 15:57
3

To co podałeś zwykle istnieje w głównym pliku projektu, czyli w pliku .dpr (lub .lpr pod Lazarusem); Oczywiście nie jest powiedziane, że tego nie można przenieść do innego modułu - ważne, żeby w tym module był w liście Uses moduł Forms, bo w nim znajduje się obiekt Application; Ale to mniej ważne;

Wracając do problemu - tak, wszystkie formularze są w tym momencie tworzone i ładowane do pamięci; Tych okien nie widać, są ukryte, jednak zabierają czas procesora przy rozruchu i zapychają pamięć; Im więcej formularzy tworzonych na starcie, tym dłużej trwa rozruch - to raczej normalne; Natomiast im więcej danych same formularze trzymają, tym bardziej zapychają pamięć - to też oczywiste;

Statycznie tworzone okna są dobre dla świeżaków, dopiero zaczynających przygodę z programowaniem aplikacji okienkowych; Najlepszym co można zrobić to tworzyć formularze dynamicznie - tylko wtedy, gdy są faktycznie potrzebne; Oczywiście wszystko zależy od przypadku, jednak należy przyjąć zasadę, że nie zajmujemy pamięci, jeśli nie jest to nam potrzebne w danej chwili; Tym bardziej, jeśli aplikacja posiada dziesiątki lub setki okien - tworzenie ich wszystkich przy rozruchu to samobójstwo;

Dynamiczne tworzenie okien jest bardzo proste, przykład:

SubForm := TSubForm.Create(Self); // bieżący formularz jako właściciel
try
  { operacje inicjujące - tu lub w konstruktorze klasy TSubForm }

  SubForm.ShowModal();

  { operacje finalizujące - tu lub w destruktorze klasy TSubForm }
finally
  SubForm.Free();
end;

To taki prosty schemat, dzięki któremu okienko tworzone jest na rządanie, wyświetlone modalnie (jako okno dialogowe), a po zamknięciu zwalniane z pamięci; Dzięki temu program zawsze będzie wykorzystywał minimalną ilość pamięci;

Koniec końców i tak wszystko zależy od przypadku, jednak jeśli dany formularz nie musi być cały czas widoczny to nie powinien zajmować pamięci.


edytowany 1x, ostatnio: furious programming, 2016-05-01 15:58

Pozostało 580 znaków

2016-05-01 16:42
0

Już widziałem aplikację która na starcie uruchamia 100 okien. Na całe szczęście dodano progressbar który pokazuje jak jeszcze daleko do odpalenia programu. Bo na wolniejszych komputerach program startował jakieś 30+ sekund.

Ogólnie to powinno się moim zdaniem uruchamiać tylko okno główne/ewentualnie logowania do systemu oraz wszelkie data module. Resztę tworzymy dynamicznie jak to kolega wyżej pokazał.

Pozostało 580 znaków

2016-05-01 18:10
0

Czy po uruchomieniu programu, kiedy już wszystke okna zą załadowane ma wpływ na obciążenie działania programu. Czy procesor poświeca czas na obsługę tych okien które są nie widoczne.

Pozostało 580 znaków

2016-05-01 19:49
3

Te okna nie dostają żadnych komunikatów systemowych, więc na dobrą sprawę tylko zapychają pamięć.

Ale myślę że na razie nie musisz się tym przejmować. Pomyśl, że przecież nawet gdybyś zrobił wszystko dynamicznie tworzone, pewnie nie zauważyłbyś zbytniej różnicy w performance, prawda?

Ps: no chyba że wsadzisz tam jakieś timery które się same włączają. One wtedy będą działać.


edytowany 1x, ostatnio: TomRiddle, 2016-05-01 22:23

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0