Autor Téma: Formulár - dlhá odozva  (Přečteno 255 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Formulár - dlhá odozva
« kdy: 04-12-2022, 12:49:00 »

Už sa to tu párkrát preberalo, ale... Môj prípad:

Všetko sa týka doby behu dopytu/ov. Slúžia ako zdroj údajov pre VirtualStringTree (VST). Po naplnení VST ich zatváram.
Točí sa to okolo tabuľky DEPOSITS. Testovacie údaje: 16 740 000 záznamov
  • Momentálne sa dostávam na 6-7 sekúnd. Aj to je pri čakaní pre užívateľa (aj pre mňa) veľa
  • Mám aj podstatne dlhšie. Robím optimalizáciu. Netuším, či sa mi to tam podarí zraziť. Tie dlhšie sa týkajú zostáv
  • Časy výpočtov ešte nemám. Tam by to malo byť v poriadku. Prvý krok je výber údajov z DEPOSITS a uloženie do GTT. Potom pracujem len s ňou


A)
  • Samozrejme, že nechcem aby užívateľ mohol počas behu dopytov čokoľvek urobiť
  • Nič nepokazí, ale reakcia a stav formulára sú nepredvídateľné
Vidím dve základné možnosti:
  • zobraziť modálne okno s oznamom. Ak sú dopyty krátke, tak budem mať zbytočné a nepríjemné preblikávanie okna
  • MyForm.Enabled := False -> True; To sa tvrdo neodporúča. Súhlasím s týmto názorom
Časy by som mohol zhruba odhadnúť podľa veľkosti tabuľky DEPOSITS
Aký je správny spôsob/postup?


B)
Ako na tento špeciálny prípad
Mám jeden formulár, kde mám tri podformuláre. S tým istým dopytom. Opakuje sa 3x. Celkový čas je 27 sek. Ako to vyriešiť?
  • Dopyt spustiť len raz a DataSet použiť vo všetkých podformulároch. Momentálny nápad - zdá sa mi najčistejší
  • Pri vysokých časoch mať tri samostatné formuláre. Pre užívateľa to bude menej pohodlné. Nepáči sa mi to
.
Nevedel som to napísať kratšie. Ďakujem za porozumenie
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Jan Fiala

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 4
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Formulár - dlhá odozva
« Odpověď #1 kdy: 05-12-2022, 07:21:07 »
Ad B)
Pokud potřebuješ pracovat s výsledky různě, pak jeden dotaz a výsledek dotazu do pracovních datasetů "nakopírovat".

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Formulár - dlhá odozva
« Odpověď #2 kdy: 05-12-2022, 09:19:12 »
Len neviem/nevedel som(?) ako na to.
Jeden nápad mám z dnešného rána. Začal som čítať knihu Delphi Injection - Nick Hodges. Dá sa voľne stiahnuť. Tá ma inšpirovala. Vytvorím si novú triedu, kde budú len tie SQL. Použijem vstrekovanie. Takže sa nebude dediť. Voľná väzba :)  Tak mám voľnú ruku na jej použitie podľa ľubovôle.
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1197
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Formulár - dlhá odozva
« Odpověď #3 kdy: 05-12-2022, 18:00:07 »
Nesnažil jsem se pochopit úplně celý problém, ale už podle příznaků je jediné správné řešení používání vlákna k načtení dat.
To tam třeba i máš. Pak si určíš hranici, kdy je prodleva ještě akceptovatelná (1s). Do té doby nic nezobrazíš, u delších dotazů ukážeš okno.
« Poslední změna: 05-12-2022, 18:02:55 od < z > »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Formulár - dlhá odozva
« Odpověď #4 kdy: 05-12-2022, 19:05:19 »
Nesnažil jsem se pochopit úplně celý problém, ale už podle příznaků je jediné správné řešení používání vlákna k načtení dat.
To tam třeba i máš. Pak si určíš hranici, kdy je prodleva ještě akceptovatelná (1s). Do té doby nic nezobrazíš, u delších dotazů ukážeš okno.
To mi silne fandíš. V živote som vlákno nepoužil. To vieš, nepoznám to, tak sa bojím. A ešte keď čítam k tomu diskusie...
Uvidím či to bude potrebné. Ešte mám v zálohe optimalizáciu. Viď Jan Fiala.
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3467
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Formulár - dlhá odozva
« Odpověď #5 kdy: 05-12-2022, 20:10:57 »
Nesnažil jsem se pochopit úplně celý problém,
Ani ja ne

Citace
ale už podle příznaků je jediné správné řešení používání vlákna k načtení dat.
Tezko rict, co to presne resi, ale pokud jde jen o zobrazovani obsahu, tak je to VTV, takze pokud ctis virtualitu a resis obsah v OnInitNode a OnInitChildren, tak se cte on-demand jen par viditelnych uzlu a pak kdyz BFU rozklikne uzel. A cist to po relativne malych davkach by melo byt casove unosne.

Jinak souhlas: casove narocna operace nema v main threadu co delat.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Formulár - dlhá odozva
« Odpověď #6 kdy: 05-12-2022, 21:08:51 »
Rozhodnem sa podľa toho ako sa mi to vykryštalizuje.
Tých uzlov tam nebude nikdy veľa. Toľko, koľko je bytov v SVB + max 10. U nás, čo ja viem, sú najväčšie domy so 104 bytmi. V takom bývam. Sú aj väčšie domy typu Čínsky múr. Ale tie sú vždy delené na viac SVB.
Takže starosť s počtom uzlov mi odpadá.
Snažím sa, aby časovo náročná operácia bola akurát pri výpočte vyúčtovania. Aj tam to bude do 1 min. Tu užívateľovi priebežne vypisujem časy jednotlivých akcií - má prehľad čo sa deje.
Nateraz som stiahol časy na max 6 s. To je dobré. Veľmi som v to nedúfal. V bežnej praxi budú odozvy minimálne.
Ostáva mi posledná optimalizácia B) Niečo už mám čiastočne v hlave.
.
Príklad: bytov 104 roky 100 služieb 20 mesiacov 12 = 1 248 000 záznamov. 8)
Veľmi som nepredpokladal, že to niekto prečíta celé.
Ďakujem za všetky reakcie.
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Jan Fiala

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 4
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Formulár - dlhá odozva
« Odpověď #7 kdy: 06-12-2022, 12:35:01 »
Nepoužíváš náhodou pro výsledek z Query virtuální tabulky? Vždyť i do ní to musíš přes její metodu (např. CopyData) načíst. Tak to místo do jedné načteš z jednoho query do 3 tabulek

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Formulár - dlhá odozva
« Odpověď #8 kdy: 06-12-2022, 15:05:38 »
Nepoužíváš náhodou pro výsledek z Query virtuální tabulky? Vždyť i do ní to musíš přes její metodu (např. CopyData) načíst. Tak to místo do jedné načteš z jednoho query do 3 tabulek
Hneď na začiatku som písal: pre VirtualStringTree . To kopírovanie z jedného stromu do ostatných mi prišlo na um. Práve som na tom začal pracovať.
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1197
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Formulár - dlhá odozva
« Odpověď #9 kdy: 06-12-2022, 19:19:19 »
A vyúčtování 1 min. máš urobené ako? Application.ProcessMessages? :)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Formulár - dlhá odozva
« Odpověď #10 kdy: 06-12-2022, 20:22:23 »
A vyúčtování 1 min. máš urobené ako? Application.ProcessMessages? :)
Ešte som to neriešil. To je vlastne bod A). K nemu sa nikto nevyjadril. Ešte na to zatlačím.
Application.ProcessMessages nemám nikde použité, lebo:

  • neviem o tom vôbec nič
  • veľmi tvrdo to neodporúčajú. Všade. Tu, DelphiPraxis...

Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1197
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Formulár - dlhá odozva
« Odpověď #11 kdy: 06-12-2022, 22:11:12 »
Tak to máš správné informace. Vlákna nejsou raketová věda

Pár vteřin jsem hledal a toto je úplně nádherná ukázka, kdy CreateAnonymousThread je jen pár řádků navíc.
Napsal to nějaký Marco pro Android, ale to nevadí :)
https://blog.marcocantu.com/blog/2014_may_background_delphi_android_threads.html

Ale i toto je nádherná sbírka demo příkladů
https://github.com/djjd47130/DelphiThreadDemo

To jen kdyby to někoho zajímalo ...

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Formulár - dlhá odozva
« Odpověď #12 kdy: Dnes v 09:12:09 »
Ďakujem za odkazy. Pozriem sa na ne.
Ako tak rozmýšľam a vidím problémy, ktoré treba riešiť pri jedináčikovi, tak najlepšie/najjednoduchšie riešenie bude predsa: rozbiť to na tri samostatné formuláre.
  • tam to už mám vyriešené
  • budú podstatne svižnejšie. Aj keď pri jednom SVB tam bude zanedbateľný rozdiel
  • akurát to nebude pokope. To je len môj uhol pohľadu. Občas ho treba zmeniť :)
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Jan Fiala

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 4
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Formulár - dlhá odozva
« Odpověď #13 kdy: Dnes v 11:06:43 »
Hneď na začiatku som písal: pre VirtualStringTree .

Ale ten Virtual StringTree musí z něčeho data brát, ne? Ty mu tam podstrčíš přímo výsledky SQL dotazu a ten necháš otevřený?
Pak by to šlo přes ty memory table udělat úplně jednoduše.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Formulár - dlhá odozva
« Odpověď #14 kdy: Dnes v 12:20:40 »
Hneď na začiatku som písal: pre VirtualStringTree .
Ale ten Virtual StringTree musí z něčeho data brát, ne? Ty mu tam podstrčíš přímo výsledky SQL dotazu a ten necháš otevřený?
Pak by to šlo přes ty memory table udělat úplně jednoduše.
Podstrčím výsledky len do jedného. Dopyt vždy zavriem. Potom skopírujem uzly (+ údaje) do ďalších dvoch VTV. CopyTo mi nejako nefungovalo. Mám vlastnú funkciu na kopírovanie údajov z jedného uzla do druhého. Túto časť považujem za uzavretú. Dostal som sa na 5,5 sek.
Problém mám v tom, že pre každý strom zobrazujem dole súčty hodnôt v troch stĺpcoch. To pri jedináčikovi to neviem vyriešiť. Rozhodol som sa ísť cestou na obrázku.
Použijem pôvodné riešenie. Keďže je všetko formou podformulárov, tak nie je problém vytvoriť 3 samostatné formuláre. Ten jeden klik navyše užívateľovi neublíži. A ja som sa zbavil zodpovednosti ;D


Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.