Forum Delphi.cz

Delphi => Obecné => Téma založeno: František 05-12-2018, 09:42:37

Název: Embarcadero príklad
Přispěvatel: František 05-12-2018, 09:42:37
http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/Generics_Collections_TDictionary_(Delphi) (http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/Generics_Collections_TDictionary_(Delphi))

ja viem že je to len example
ale

Kód: Delphi [Vybrat]
  1. City := TCity.Create;

v úvode 3x po sebe, nemá žiadne Free

je to košér?

lebo ak je to príklad, mal by isť príkladom, či?
Název: Re:Embarcadero príklad
Přispěvatel: JaroB 05-12-2018, 09:48:40
Vlastní ho Dictionary a to si ho uvolní ve svém Clear/Free, ne?
Název: Re:Embarcadero príklad
Přispěvatel: Stanislav Hruška 05-12-2018, 11:26:30
Citace
v úvode 3x po sebe, nemá žiadne Free
Na samom konci je jedno uvoľnenie. To asi nepostačuje. Nejako som to neštudoval.
Název: Re:Embarcadero príklad
Přispěvatel: František 06-12-2018, 17:16:50
takže kedy budú uvoľnené vytvorené objekty city, ktoré boli pridané do Dictionary?
Název: Re:Embarcadero príklad
Přispěvatel: vandrovnik 06-12-2018, 18:21:18
takže kedy budú uvoľnené vytvorené objekty city, ktoré boli pridané do Dictionary?

Při běhu toho programu nebudou uvolněné (memory leak). Po ukončení aplikace je celá ta paměť vrácena operačnímu systému.
Název: Re:Embarcadero príklad
Přispěvatel: František 06-12-2018, 19:41:16
takže ak to chcem využívať počas celého behu programu, tak to nemusím teda vôbec riešiť?
Název: Re:Embarcadero príklad
Přispěvatel: vandrovnik 06-12-2018, 20:32:50
Normální životní cyklus by měl být takový, že vytvořím, držím si odkaz a používám, používám, používám, a když už používat nechci, tak uvolním. Já jsem zvyklý to mít zhruba takto:

Kód: Delphi [Vybrat]
  1. m:=tMemoryStream.Create;
  2. try
  3.  ...
  4.  ...
  5. finally
  6.  FreeAndNil(m);
  7. end;
Název: Re:Embarcadero príklad
Přispěvatel: Stanislav Hruška 06-12-2018, 20:37:00
Prakticky áno. Ak to chceš mať z programátorskeho hľadiska čisté, tak to pri ikončení aplikácie uvoľníš. Taký FMM4 by ti kričal, že máš memory leak. Len taká podotázočka: používaš ho?
Název: Re:Embarcadero príklad
Přispěvatel: vandrovnik 06-12-2018, 20:47:47
Prakticky áno. Ak to chceš mať z programátorskeho hľadiska čisté, tak to pri ikončení aplikácie uvoľníš. Taký FMM4 by ti kričal, že máš memory leak. Len taká podotázočka: používaš ho?

Správná připomínka - aby "to křičelo", dá se přidat do .dpr souboru, nejlépe hned za begin:
Kód: Delphi [Vybrat]
  1.  {$IFDEF DEBUG}
  2.   System.ReportMemoryLeaksOnShutdown:=true;
  3.  {$ENDIF}
  4.  
Název: Re:Embarcadero príklad
Přispěvatel: Stanislav Hruška 06-12-2018, 21:10:03
FMM4 je, aspoň podľa návodu čo som čítal o ReportMemoryLeaksOnShutdown, pružnejší. Vypíše memory leak už pri uzavretí formulára. To značne uľahčuje prácu.
Název: Re:Embarcadero príklad
Přispěvatel: Radek Červinka 06-12-2018, 22:42:05
FMM4 je, aspoň podľa návodu čo som čítal o ReportMemoryLeaksOnShutdown, pružnejší. Vypíše memory leak už pri uzavretí formulára. To značne uľahčuje prácu.

Jelikož ReportMemoryLeaksOnShutdown je testována až ve finalization sekci FastMM4.pas tak to jednoznačně není pravda, navíc nechápu jak by to mělo fungovat, protože i z různých formulářů můžeš alokovat třeba globální proměnné nebo cokoliv jiného a ten memory manager by to v tvém případě reportoval. Prostě je to nesmysl, možná si to pleteš se zavřením posledního formuláře.
Název: Re:Embarcadero príklad
Přispěvatel: František 07-12-2018, 09:09:17
takže keď v OnCretae naplním v cykle Dictionary s TCity, musím/mal by som to pri OnClose uvolniť? alebo stačí uvolniť Dictionary (a sním pôjde aj city)?
Název: Re:Embarcadero príklad
Přispěvatel: vandrovnik 07-12-2018, 09:33:42
Když něco vytvoříš v OnCreate, tak to obvykle chceš uvolnit v OnDestroy. V OnClose bych to nedělal, protože zavřený formulář je možné opakovaně zobrazit - někdy se to hodí, protože se zobrazí rychleji, než když se musí nejdřív vytvořit.

tDictionary se o uvolnění nepostará, ale tObjectDictionary to umí - při volání Create mu předáváš jako parametr, zda se má starat o život klíčů a život hodnot.
Název: Re:Embarcadero príklad
Přispěvatel: František 08-12-2018, 13:59:14
vdaka
takze momentálne tam mám tDictionary, mám to nahradiť?

ps. OnCreate a OnClose sú evety hlavného formulara, takže mam to teda dat radšej na OnDestroy?
Název: Re:Embarcadero príklad
Přispěvatel: Stanislav Hruška 08-12-2018, 14:44:27
Citace
ps. OnCreate a OnClose sú evety hlavného formulara, takže mam to teda dat radšej na OnDestroy?
Každý je iný a má svoju špecifikú úlohu. Kedysi som si dal tú namahu a vytvoril toto - príloha:



Název: Re:Embarcadero príklad
Přispěvatel: Stanislav Hruška 11-12-2018, 11:17:33
Citace
Jelikož ReportMemoryLeaksOnShutdown je testována až ve finalization sekci FastMM4.pas tak to jednoznačně není pravda, navíc nechápu jak by to mělo fungovat, protože i z různých formulářů můžeš alokovat třeba globální proměnné nebo cokoliv jiného a ten memory manager by to v tvém případě reportoval. Prostě je to nesmysl, možná si to pleteš se zavřením posledního formuláře.
Teraz som si overil, že niektoré veci hlási už pri uzavretí fromulára. Pokus o uvoľnenie už uvoľneného objektu.
Ale máš pravdu. Nie je to MemoryLeak. To som nerozlíšil/neuvedomil si.
Název: Re:Embarcadero príklad
Přispěvatel: František 12-12-2018, 09:34:55
takže to patrí do
Kód: Delphi [Vybrat]
  1. initialization
  2. finalization
?
Název: Re:Embarcadero príklad
Přispěvatel: Stanislav Hruška 12-12-2018, 10:47:59
Mne tu napísali, že tie dve sekcie sa používajú v špeciálnych prípadoch (asi v spojení s interface) a bežných prípadoch sa to nemá  používať. Veď použi ten TObjectDictionary a nemáš čo riešiť. A ako písali, uvoľniť/zlikvidovať to v MyForm.OnDestroy
Název: Re:Embarcadero príklad
Přispěvatel: František 14-12-2018, 11:36:45
v podstate ten slovnik pouziavaju vsetky formulare, ale vsetky su volane z hlavneho, tak ok OnKrijejt, OnDestroj
Název: Re:Embarcadero príklad
Přispěvatel: Stanislav Hruška 14-12-2018, 13:28:40
Máš ešte jednu možnosť. Slovník vytvoriť i zničiť v súbore *.dpr. + tým pádom nebudeš musieť robiť prepojenie na hlavný formulár. To občas robí problémy s kruhovými odkazmi. Ja ani v jedinom svojom formulári nemám odkaz na hlavný fromulár.
Název: Re:Embarcadero príklad
Přispěvatel: Jirka 14-12-2018, 14:47:03
Osobne bych se snazil tyto objekty oddelit od UI (tedy formularu a jeho udalosti), ale to uz je jine tema...

Mám taky tento názor.
V tomto případě se mi jeví jako nejvhodnější   použít Datamodul   
IMHO  lepší než   *.dpr  nebo  sekce "ini/fini"
Název: Re:Embarcadero príklad
Přispěvatel: Jirka 14-12-2018, 15:17:09
Volil bych spis separatni modul (unit) a v nem implementoval singleton.

Tuto techniku prakticky vůbec nepoužívám , takže je mi bližší D.M .
Název: Re:Embarcadero príklad
Přispěvatel: Ondřej Pokorný 14-12-2018, 17:15:58
Máš ešte jednu možnosť. Slovník vytvoriť i zničiť v súbore *.dpr. + tým pádom nebudeš musieť robiť prepojenie na hlavný formulár. To občas robí problémy s kruhovými odkazmi.

Tak takovou čípovinu jsem neslyšel už dlouho. No třeba jenom nechápu.

Ja ani v jedinom svojom formulári nemám odkaz na hlavný fromulár.

Toto tě naopak zase ctí.
Název: Re:Embarcadero príklad
Přispěvatel: Stanislav Hruška 14-12-2018, 17:55:27
Citace
Tak takovou čípovinu jsem neslyšel už dlouho. No třeba jenom nechápu.
Aspoň má úplne jasne dané ako to nerobiť :D 
A pre mňa to znamená pozrieť do dpr a upraviť ho. Vytváram tam globálny objekt (globálne premenné), ktorý používam počas celej životnosti programu.
Název: Re:Embarcadero príklad
Přispěvatel: Ondřej Pokorný 15-12-2018, 09:44:21
Globální proměnná se v souboru projektu prostě nedá deklarovat.
Název: Re:Embarcadero príklad
Přispěvatel: Radek Červinka 15-12-2018, 16:17:38
Globální proměnná se v souboru projektu prostě nedá deklarovat.


Kód: Delphi [Vybrat]
  1. program Project18;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. {$R *.res}
  6.  
  7. uses
  8.   System.SysUtils;
  9.  
  10. var
  11.   tady: string;
  12.  
  13. begin
  14.  
  15. end.
  16.  
  17.  

Je to globalni promenna, ale moc parady s tim neudelas.