Delphi > Firemonkey

DB Query ve vlakne a vykresleni vysledku na tFlowLayout

(1/2) > >>

raul:
Zdar,
nejak jsme se debilne zasek na asynchronnim dotazem do db (postgresDac) a naslednym vykreslenim vyslekdu do flowlayout.
Na formu mam Edit a v eventu OnChangeTracking spoustim dva dotazy do db. Prvni vyhleda slova podobna zadanemu, pro kazde vytvori label (idealne pak v rectangle) a mrskne ho na flowlayout. Nejak ovsem zapasim s tTask.Run vlakny, synchronizaci apod (seznam labelu se vzdy pred dotazem komplet maze (vyslekdy se dost lisi i s pismenem, tudiz neni duvod to nejak cachovat). Dotaz do db trva nekdy par vterin,  proto ho nechci poustet primo v hlavnim vlakne. Na druhou stranu, kdyz napisu dalsi pismeno, bylo by prima ten task ukoncit (ve while muzu mit podminku).

Druhy dotaz do db je +- podobny, na druhy tlayout se doplni panel se 2 labely a jednim obrazkem (ten se dotahuje pres synapsi z https). Toto by take slo udelat jako spesl tasky (pak je ale otazka, jak nalozit s jiz zmizelymi timage (protoze uzivatel pise dale a tudiz jiz data nejsou platna)). Cele to ma byt jednoducha utilitka, takze jsem si chtel ujednodusit praci, nez vytvaret sve vlakna, frontu pozadavku apod).

Je mozne nejakej nakopnuti ?

UpdateWords:

smaz obsah

task.run
(
  criticalsection.acq;
  pust dotaz do db
  tthread.synchronize
 (
   words.beginupdate;
   try
   while not eof do
   .
   .
   .
   finally
     words.endupdate;
   end;
 )
 criticalsection.leave;
)

Jako ono to +- funguje, akorat ze i pres begin/end update se obcas proste labely prekreslujou pres sebe a pomuze jen resize okna formulare.

P.S.> GUI aplikace skorem nedelam, max obcas nejakou takovouhle utilitku, tak s tim zapasim..

pf1957:

--- Citace: raul  07-11-2020, 20:09:46 ---Jako ono to +- funguje, akorat ze i pres begin/end update se obcas proste labely prekreslujou pres sebe a pomuze jen resize okna formulare.

--- Konce citace ---
S opici nedelam, ale ve VCL bylo obvykle, ze Begin/End update jen zamezovalo propagovani zmeny dat dal tj. prekreslovani, generovani udalosti apod., ale netykalo se exkluzivniho pristupu.

Resil bych to tak, ze v okamziku, kdy BFU zmeni hledany pattern, tak bych existujici tasky nejak "odstrihl" od UI a bud je nechal na pozadi dobehnout bez vlivu na UI nebo je nejak ukoncil tj. zajistil, ze v jeden okamziku mam jen jednu sadu dotazu, jejichz vysledek poleze do UI a ktery bude odpovidat posledni zmene provede BFU.

raul:
Diky, me slo prave o praci s taskem (tzn jak rozumne ukoncovat apod), a parametry pro prenos mezi synchronize a prave v FMX. Zkousel jsem to napsat ve VCL a tam to chodilo o dost rychleji a o dost lepe (kod komplet zkopirovan a jen upraven pro kompatibilitu s vcl.

Viditelne je cely fmx napsany stejne kvalitne jako dalsi casti kodu - pomale, s x novymi - ne vzdy zdokumentovanymi postupy/vlastnostmi.

pf1957:

--- Citace: raul  08-11-2020, 13:53:37 ---Diky, me slo prave o praci s taskem (tzn jak rozumne ukoncovat apod), a parametry pro prenos mezi synchronize a prave v FMX. Zkousel jsem to napsat ve VCL a tam to chodilo o dost rychleji a o dost lepe (kod komplet zkopirovan a jen upraven pro kompatibilitu s vcl.

--- Konce citace ---
Ani s tasky jsem v Delphi nic podstatnejsiho nedelal, v C# ma konstruktor parametr CancelationToken, ktery jsem mu predaval a kterym lze tasku signalizovat, ze to ma zabalit. Jestli ma neco podobneho TTask nevim.

Jinak by melo stacit mu pred startem tasku vygenerovat a predat nejake sekvencni cislo, ktery by na zacatku metody v Synchronize porovnal a kdyz by mu nesouhlasilo, tak by nic nedelal. Pak by stacilo jen pri kazde zmene to cislo inkrementovat. Vlastni exkluzivitu by mu zajistilo to Synchronize, protoze ve VCL  je implementovano zaslanim zpravy WM_NULL do hlavniho threadu (GUI), pokud se v nem nestoura do pumpy zprav napr. volanim Application.ProcessMessages.

Ale jak je to v opici pripadne na jinych platformach nevim.

pf1957:

--- Citace: pf1957  08-11-2020, 15:59:36 ---[...]
v C# ma konstruktor parametr CancelationToken, ktery jsem mu predaval a kterym lze tasku signalizovat, ze to ma zabalit. Jestli ma neco podobneho TTask nevim.

--- Konce citace ---
Podle Helpu bych to v Delphi zrejme delal pres ITask, ktere ma metody Cancel a CheckCanceled

Navigace

[0] Seznam témat

[#] Další strana

Přejít na plnou verzi