Autor Téma: Ako ukoncit Anonymny trejd z hlavneho okna  (Přečteno 664 krát)

Offline František

  • Guru
  • *****
  • Příspěvků: 829
  • Karma: 7
    • Verze Delphi: comunity 10.4.2, D2007, D11
Ako ukoncit Anonymny trejd z hlavneho okna
« kdy: 23-11-2022, 21:11:31 »
alebo ako zabespecit, aby sa ukoncil pri zatvoreni app - hlavneho okna

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1197
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Ako ukoncit Anonymny trejd z hlavneho okna
« Odpověď #1 kdy: 23-11-2022, 21:38:05 »
Myslel jsem, že "while not Terminated do" bude dost, ale nestane se tak. Aplikace nezajistí terminate. Až OS to sestřelí.
Trochu lepší je možnost použít "Application.Terminated", ale to neni jistota.

Jediná jistota je udělat si alternativní anonymní vlákno bez FreeOnTerminate. Anonymní to mají zapnuté, takže uchovávat si odkaz na vlákno je dost nebezpečné.
Budeš si muset udělat seznam vláken, nakonec je všechny zastavit a počkat (WaitFor)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3183
  • Karma: 111
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Ako ukoncit Anonymny trejd z hlavneho okna
« Odpověď #2 kdy: 23-11-2022, 23:21:00 »
Kdysi jsem narazil na pekne reseni, Dalija odkazovala ze sveho blogu na https://stackoverflow.com/questions/72201947/how-to-wait-that-all-anonymous-thread-are-terminated-before-closing-the-app/72225744#72225744

V podstate udrzuje pocet anonymnich threadu a pri ukonceni hlavniho formulare je signalizuje pro ukonceni.
Embarcadero MVP - Czech republic

Offline František

  • Guru
  • *****
  • Příspěvků: 829
  • Karma: 7
    • Verze Delphi: comunity 10.4.2, D2007, D11
Re:Ako ukoncit Anonymny trejd z hlavneho okna
« Odpověď #3 kdy: 24-11-2022, 15:43:55 »
nechcem cakat na ukoncenie, chcem ich nasilne ukoncit pri zavreti app

v podstate tam mam observer, kde mam zoznam objektov, a tie maju metody co vytvaraju tie anonymne trejdy (jeden objekt jedno vlakno),
takze by som to mohol vyuzit, len ako realne (spravne) previest to samotne ukoncenie tapam

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3467
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Ako ukoncit Anonymny trejd z hlavneho okna
« Odpověď #4 kdy: 24-11-2022, 16:12:02 »
v podstate tam mam observer, kde mam zoznam objektov, a tie maju metody co vytvaraju tie anonymne trejdy (jeden objekt jedno vlakno),
takze by som to mohol vyuzit, len ako realne (spravne) previest to samotne ukoncenie tapam
Cesta, ze bys korektne ukoncil thread zvnejsku bez jeho spoluprace v podstate neexistuje, alespon pod woknama - to je vzdy akce naprasaka viz TerminateThread.

Takze to vyzaduje nejakou spolupraci na strane vlastniho threadu, ktery muze testovat treba hodnotu Terminated, ale jeji nastaveni predpoklada, ze mas nekde zapamatovanou referenci na ten thread, coz u FreeOnTerminate threadu nelze, protoze po rozebehnuti threadu to uz muze byt dangling pointer...

Takze se to delava tak, ze se udela globalni Event (ve smyslu synchronizacniho objektu OS), ktera je po celou dobu behu programu v non-signaled stavu a jejiz handle se da predat kazdemu threadu aby ji zahrnul do svych cekani pomoci WaitForMultipleObjects a v pripade jeji signalizace sam sebe korektne ukoncil.

No a pak pri exitu/vnitrnim restartu aplikace staci tu globalni event nastavit do stavu signaled a vsechny thready by se na to mely drive ci pozdeji dobrovolne ukoncit.

Ale pak bys mel stejne cekat, jestli ti tam nejaky nezustal viset a pro tready v rezimu FreeOnTerminate bys musel pouzit neco, jako ti posilal
Radek, abys obesel riziko vzniku dangling pointeru

Offline František

  • Guru
  • *****
  • Příspěvků: 829
  • Karma: 7
    • Verze Delphi: comunity 10.4.2, D2007, D11
Re:Ako ukoncit Anonymny trejd z hlavneho okna
« Odpověď #5 kdy: 24-11-2022, 16:19:55 »
posielam tomu vlaknu callBack TProc, a keby som hlavnemu vlaknu vratil v tom callbacku druhy callBack na ten trejd? to by slo? (a tam by mu oznamil ze to chem ukoncit?)
« Poslední změna: 24-11-2022, 16:22:50 od František »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3467
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Ako ukoncit Anonymny trejd z hlavneho okna
« Odpověď #6 kdy: 25-11-2022, 09:24:13 »
posielam tomu vlaknu callBack TProc, a keby som hlavnemu vlaknu vratil v tom callbacku druhy callBack na ten trejd? to by slo? (a tam by mu oznamil ze to chem ukoncit?)
Tak tomu nerozumim.

Jakmile mas automaticky se destruujici thread, tak na nej nesmi existovat odkaz odjinud a callback je zase jen odkaz... Co by slo mu poslat dva callbacky a pomoci druheho by se thread nekde (hlavniho threadu) dotazoval, jestli se nema ukoncit tj. v podstate delegovani testu Terminated mimo thread a bylo by to decouplovane.

Offline František

  • Guru
  • *****
  • Příspěvků: 829
  • Karma: 7
    • Verze Delphi: comunity 10.4.2, D2007, D11
Re:Ako ukoncit Anonymny trejd z hlavneho okna
« Odpověď #7 kdy: 25-11-2022, 13:27:24 »
upresnenie:
ja vlastne nepotrebujem ukoncovat trejd, ale ukoncit cyklus v nom, a trejd sa potom ukonci (korektne) sam, len mu musim dat informaciu ze to ma prerusit, a informaciu o tom, ze ci sa este trejd (ten cyklus v nom) vykonava, mam z zozname (gde sa pred ukoncenim trejdu sam z tohoto zoznamu odstrani)

takze som si pridal do toho zoznamu property BreakIt a pri kazdom prechode sa checkuje ci sa ma prerusit, je to ok?

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3467
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Ako ukoncit Anonymny trejd z hlavneho okna
« Odpověď #8 kdy: 26-11-2022, 09:26:54 »
upresnenie:
ja vlastne nepotrebujem ukoncovat trejd, ale ukoncit cyklus v nom, a trejd sa potom ukonci (korektne) sam, len mu musim dat informaciu ze to ma prerusit, a informaciu o tom, ze ci sa este trejd (ten cyklus v nom) vykonava, mam z zozname (gde sa pred ukoncenim trejdu sam z tohoto zoznamu odstrani)

takze som si pridal do toho zoznamu property BreakIt a pri kazdom prechode sa checkuje ci sa ma prerusit, je to ok?
Ano, to lze. BTW jsem nepochopil, protoze threadu rikas nesmyslne trade...

Offline František

  • Guru
  • *****
  • Příspěvků: 829
  • Karma: 7
    • Verze Delphi: comunity 10.4.2, D2007, D11
Re:Ako ukoncit Anonymny trejd z hlavneho okna
« Odpověď #9 kdy: 26-11-2022, 09:53:38 »
vdaka

2pf polepsimsa