Autor Téma: Aktualizácia GUI z theadu  (Přečteno 367 krát)

Offline František

  • Guru
  • *****
  • Příspěvků: 690
  • Karma: 7
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Aktualizácia GUI z theadu
« kdy: 24-07-2021, 21:19:20 »
ako spravne aktualizovat napr. progres bar z threadu

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3280
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Aktualizácia GUI z theadu
« Odpověď #1 kdy: 24-07-2021, 21:36:03 »
Volanim metody TThread.Queue(...) (nepotrebujes ve threadu cekat, az se to zobrazi)

Offline František

  • Guru
  • *****
  • Příspěvků: 690
  • Karma: 7
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Aktualizácia GUI z theadu
« Odpověď #2 kdy: 25-07-2021, 19:49:34 »
aj vtedy ked menim z threadu na vizualnej komponente tag?

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 223
  • Karma: 2
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Aktualizácia GUI z theadu
« Odpověď #3 kdy: 26-07-2021, 08:14:48 »
Pak muzes pouzit i TThread.Synchronize()

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3280
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Aktualizácia GUI z theadu
« Odpověď #4 kdy: 26-07-2021, 09:22:40 »
Excellent
Rated 1 time
aj vtedy ked menim z threadu na vizualnej komponente tag?
Zalezi, k cemu to pouzivas: pokud od toho nechces atomicitu ve smyslu Test&Set a nevadi ti, ze pri nejake probihajici operaci v hlavnim treadu se muze hodnota Tag zmenit, tak bys ani nemusel, protoze Tag je definovan jako NativeInt, coz by melo zajistit, ze vlastni operace read/write jsou u procesoru atomicke. Ale... mam dojem, ze nektere starsi verze Delphi meli chybnou implementaci NativeInt napr. nektere 32b prekladace ji mely 8 bytovou a navic ti nikdo nezajisti, ze treba nekdy nezmeni definici Tag s pouzitim setteru/getteru apod.

Takze za me nema smysl se uchylovat ke konstrukcim, jejichz funkcionalita je omezena radou implicitnich podminek. Ta Queue() by te moc zdrzet nemela, trochu mensi overhead ma poslani hodnoty pres pumpu zprav tj. PostMessage(). Pokud to chces jen na zobrazovani prubehu, tak ti nevadi, ze stara hodnota bude prepsana novou aniz by byla zpracovana, pokud by to vadilo, musis pouzit Synchronize().

Jeste poznamka: thread by se nemel hrabat v utrobach ciziho formu tj. lezt tam po nejakych widgetech uvnitr formu, protoze o jejich existenci nema nic vedet - hodnoty pro "styk" by mel thread dostat jako argumenty.