Autor Téma: Zatuhnutí hlavního vlákna při spuštění TTask.  (Přečteno 1583 krát)

Offline bohdan

  • Mladík
  • **
  • Příspěvků: 64
  • Karma: 2
    • Verze Delphi: 10.4.
Ahoj,

při zavolání TTask hlavní okno vytuhne (10 až 30 sekund) a potom běží dál. Je to dost náhodně a čím více jader v počítači tím je to horší.
Někdy 10 minut program běží normálně a potom najednou, když to člověk nejméně čeká tak se to kousne. Dost blbě se to ladí.
Těch TTask máme v programu několik a pokaždý se zatuhnutí stane u jiného TTask.

Je to v delphi 10.4.1 win32 aplikace a v předchozích verzích delphi jsme něco podobného nepozorovali.

Dalo by se říct, že čím horší počítač, tím lépe.

Hodně podobné chování je popsáno v https://quality.embarcadero.com/browse/RSP-32278

Nepozoroval jste někdo už něco podobného?

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3006
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Zatuhnutí hlavního vlákna při spuštění TTask.
« Odpověď #1 kdy: 02-02-2021, 16:01:19 »
Jak to presne volas?
Embarcadero MVP - Czech republic

Offline bohdan

  • Mladík
  • **
  • Příspěvků: 64
  • Karma: 2
    • Verze Delphi: 10.4.
Re:Zatuhnutí hlavního vlákna při spuštění TTask.
« Odpověď #2 kdy: 02-02-2021, 16:55:25 »
Celkem jednoduše

   TTask.Run(procedure
              begin
               // Nejaky kod
               end);

Nevolám nic, co by upravovalo vizuální komponenty.  Vypadá to, že se to sekne v momentě, kdy se provádí řádek TTask.run, ale to musím ještě prověřit.
Dost blbě se to ladí, protože to zakousnutí je dost náhodné a pokaždé na jiném TTask v programu. Jedinné co je jisté je to, že čím více jader procesorů tím aplikace zmrzne na delší dobu a je to častější.
Omylem jsem to vložil do skupiny databáze, ale chtěl jsem do delphi (omlouvám se  za to).

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3006
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Zatuhnutí hlavního vlákna při spuštění TTask.
« Odpověď #4 kdy: 03-02-2021, 18:40:25 »
Excellent
Rated 1 time
Koukni na https://quality.embarcadero.com/browse/RSP-15233
No to je docela sila: jeden by nerek, co se da vykouzlit s obycejnym thread poolem :-O

Online raul

  • Hrdina
  • ****
  • Příspěvků: 435
  • Karma: 15
    • Verze Delphi: FPC :D
Re:Zatuhnutí hlavního vlákna při spuštění TTask.
« Odpověď #5 kdy: 04-02-2021, 09:46:05 »
Bohuzel tohle budou jen tresinky na dortu, ktere vybublaj nad schopnost je tolerovat. Myslim ale, ze kvalita kodu nebude dobra vsude mozne a vysledkem je pak zbytecne pomala ci padajici aplikace obecne. Na NEKTERYCH tehle bublinkach je videt, ze je pise naprosty zacatecnik, ci nekdo, kdo nema predstavu nad dopady v ruznych variantach pouziti.
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux, (občas Delphi)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3006
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Zatuhnutí hlavního vlákna při spuštění TTask.
« Odpověď #6 kdy: 04-02-2021, 10:23:32 »
To na co naráží pisatel je
Kód: Delphi [Vybrat]
  1. function TThreadPool.TThreadPoolMonitor.IsThrottledDelay(LastCreationTick, ThreadCount: Cardinal): Boolean;
  2. var
  3.   CreationDelta: Cardinal;
  4. begin
  5.   CreationDelta := TThread.GetTickCount - LastCreationTick;
  6.   if ThreadCount > Cardinal(TThread.ProcessorCount) then
  7.     Dec(ThreadCount, TThread.ProcessorCount)
  8.   else
  9.     ThreadCount := 0;
  10.   Result := CreationDelta > Trunc(Power(1.1, ThreadCount));
  11. end;
  12.  

Což má (měla) být ochrana, že v případě (podle uvedených testů v tom RSP) mnoha požadovaných vláken (napr. TTask) bude thread pool narůstat pomaleji z původních x vláken, (podle dema se to ma začít zpomalovat od 50 tasku, a od 100 už výrazně), protože se předpokládá, že některé vlákna v poolu se brzo uvolní. Ale moc ten kod nechápu.

Osobně bych to tak nenapsal a nechal to na programátorovi, ale autori se snazili o nejakou ochranu pred zahlcením. V následujícím update to vzdávají.
Embarcadero MVP - Czech republic

Online raul

  • Hrdina
  • ****
  • Příspěvků: 435
  • Karma: 15
    • Verze Delphi: FPC :D
Re:Zatuhnutí hlavního vlákna při spuštění TTask.
« Odpověď #7 kdy: 04-02-2021, 12:17:37 »
Diky Radku za vykus, ja to jen proletl hodne zbezne!

Pokud je cas od posledniho vytvoreni vetsi 1.1 na pocetvlaken (nad pocet procesoru) pak true :) Co se deje dal jsem nezjistoval, ale predpokladam nejake ty pauzicky apod..

Takze 486 ktera nam obsluhovala 60modemu a par set telnetu - by vlastne nebyla schopna dneska fungovat (resp na inicializaci bychom cekali hoodne dlouho - peak byl mam sajna kolem 130lidi najednou).

Sakra, dyt takovehle myslenky z principu nemohou fungovat - nezalezi prec na tom kolik vlaken mam, ale kolik prace delaji (resp i jak jsou schopny zatizit procesor, ne nektery kod.. apod).

Tohle je bohuzel presne to, co je stale otazkou a zel u delphi velmi castou. Jak kvalitne je navrzen a napsan kod, ktery sice nezkonci takovymhle obcasnym zatuhavanim (ktere stoji autora nemale usili a penize to zdetekovat a diagnostikovat), ale ktery jen zpomaluje zpracovani. Mam k autorum delphi velkou uctu - neb ano, je za tim spousta prace. Kdyz uz se ale ta prace investovala, nebylo by o hodne lepsi ji rovnou udelat poradneji? Je tedy tato prace skutecne efektivne a odborne vynalozena? Nebo je to jen o tom, rychle uvadet novinky na trh a k tomu si poriditi i levnejsi/hure zdatnou pracovni silu? A ma zakaznik, ktery si zaplati za produkt resit jeho interni nekvality a psat pro ne workaroundy? Rozumne napsany ttask i s poolem se fakt da napsat za relativne za chvili.

P.S.> Libilo se mi tam to srovnani s klasictejsim zpusobem, ktery, byt nepouzil pool, byl rychlejsi. Je to starsi postup vs nova knihovna, ktera je radikalne horsi - zde jakmile mam ulohu s vice vlakny, ktere se flakaji. Z techto prikladu by se krasne dalo analyzovat, kdy se kod zacal psat spatne a flakat to a posleze odvodit programatory, kteri psali ten funkcni :)

Btw - pouziti getTickCount (nevim jak dnes, ale pred lety) nebylo vubec spravne, neb primo takto bylo schopno vratit zaporne hodnoty (tzn aktualni gettickcount < ulozeny s pred par sekundami) - je to asi 5 let zpetne, co jsme s tim meli v jedne firme docela problem a slo tusim o diferenci gettickcount mezi bezicimi jadry procesoru (je to uz dlouho, takze pamatuju uz prd).
« Poslední změna: 04-02-2021, 12:20:49 od raul »
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux, (občas Delphi)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3006
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Zatuhnutí hlavního vlákna při spuštění TTask.
« Odpověď #8 kdy: 04-02-2021, 12:48:36 »
Pokud je cas od posledniho vytvoreni vetsi 1.1 na pocetvlaken (nad pocet procesoru) pak true :) Co se deje dal jsem nezjistoval, ale predpokladam nejake ty pauzicky apod..

Naopak.
Prave pokud to vrati true tak bude velikost Threadpoolu upravovana, aspon podle pripravovaneho update
Embarcadero MVP - Czech republic

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3006
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Zatuhnutí hlavního vlákna při spuštění TTask.
« Odpověď #9 kdy: 04-02-2021, 13:18:09 »
Btw - pouziti getTickCount (nevim jak dnes, ale pred lety) nebylo vubec spravne, neb primo takto bylo schopno vratit zaporne hodnoty (tzn aktualni gettickcount < ulozeny s pred par sekundami) - je to asi 5 let zpetne, co jsme s tim meli v jedne firme docela problem a slo tusim o diferenci gettickcount mezi bezicimi jadry procesoru (je to uz dlouho, takze pamatuju uz prd).

Nevěřím, u MS o tom nic nepíší. Samozřejmě v počítačích je možné vše. Ale na 99.99% to není pravda.
Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Zatuhnutí hlavního vlákna při spuštění TTask.
« Odpověď #10 kdy: 04-02-2021, 14:19:09 »
Co se deje dal jsem nezjistoval
Tak to bych velmi doporucoval se do souboru System.Threading podivat a ne zbezne. To je overkill jak prase: tam to sackuji do fronty, sleduji zatizeni CPU a thready podle nej suspenduji, zavadeji nelinearity v pripade zahlceni jako ten throttling, etc...

Takze ja bych to na zadnou vaznou praci v oblasti multitaskingu nikdy nepouzil - to dynamicke chovani celeho toho cirkusu bude mimo kontrolu, o overheadu ani nemluve.

IMHO to vypada o pokus lezt "zizalkam" do zadku a umoznit lidem, kteri netusi co je thread a multitasking, si neco paralelne spustit ale nesmi na tom moc zalezet..

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Zatuhnutí hlavního vlákna při spuštění TTask.
« Odpověď #11 kdy: 04-02-2021, 14:21:32 »
Nevěřím, u MS o tom nic nepíší. Samozřejmě v počítačích je možné vše. Ale na 99.99% to není pravda.
Ale pisou: je to dword, ktere obsahuje pocet ms od spusteni windows, coz je necelych 50 dni. Zrejme nepredpokladaji, ze by jim neco vydrzelo pracovat dele. My jsme to vzdy resili tak, ze se udelala funkce na vypocet rozdilu, ktera to preteceni osetrila tj. pracovali jsme jen s relativnim casem.

Online raul

  • Hrdina
  • ****
  • Příspěvků: 435
  • Karma: 15
    • Verze Delphi: FPC :D
Re:Zatuhnutí hlavního vlákna při spuštění TTask.
« Odpověď #12 kdy: 04-02-2021, 14:28:41 »
Nevěřím, u MS o tom nic nepíší. Samozřejmě v počítačích je možné vše. Ale na 99.99% to není pravda.

Trochu jsem pogooglil a - ASI - se to tykalo jine funkce - QueryPerformanceCounter. Takze mozna pardon. Po tech letech ale uz fakt nevim (gettickcount jsme pouzivali mam pocit casteji).
Nasel jsem zminku treba zde :
https://bugzilla.mozilla.org/show_bug.cgi?id=676349
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux, (občas Delphi)

Online raul

  • Hrdina
  • ****
  • Příspěvků: 435
  • Karma: 15
    • Verze Delphi: FPC :D
Re:Zatuhnutí hlavního vlákna při spuštění TTask.
« Odpověď #13 kdy: 04-02-2021, 14:31:26 »
Tak to bych velmi doporucoval se do souboru System.Threading podivat a ne zbezne. To je overkill jak prase: tam to sackuji do fronty, sleduji zatizeni CPU a thready podle nej suspenduji, zavadeji nelinearity v pripade zahlceni jako ten throttling, etc...

Nastesti to sem nekdo napsal par dni predtim, nez jsem mel TTask v planu pouzit. Je ale fakt, ze uz Radkova ukazka mi dava jasnou odpoved, ze je neco blbe. Z Tve odpovedi pak usuzuju, ze opet nekdo vymejsli nejakou radobyfunkcni <> ve ktere se sam ztrati.
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux, (občas Delphi)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3006
  • Karma: 108
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Zatuhnutí hlavního vlákna při spuštění TTask.
« Odpověď #14 kdy: 04-02-2021, 14:46:22 »
Co se deje dal jsem nezjistoval
Tak to bych velmi doporucoval se do souboru System.Threading podivat a ne zbezne. To je overkill jak prase: tam to sackuji do fronty, sleduji zatizeni CPU a thready podle nej suspenduji, zavadeji nelinearity v pripade zahlceni jako ten throttling, etc...

Takze ja bych to na zadnou vaznou praci v oblasti multitaskingu nikdy nepouzil - to dynamicke chovani celeho toho cirkusu bude mimo kontrolu, o overheadu ani nemluve.

IMHO to vypada o pokus lezt "zizalkam" do zadku a umoznit lidem, kteri netusi co je thread a multitasking, si neco paralelne spustit ale nesmi na tom moc zalezet..

Částečně nesouhlasím.
Cílem té knihovny je primárně usnadnit aplikačním programátorům život, tj. spouštět různé tasky a tak podobně v rozumných intencích a tam funguje dobře -  castecne to vystihuje to tvoje zizalky, ale nebyl bych tak kruty. Jak jsem už řekl - taky si myslím, že to přehánějí, ale nevím ten důvod co za tím stal.
Pokud chceš mít 100% kontrolu, nic ti nebrání. Na druhou stranu od většiny podobných obecných knihoven nemáš zdrojáky tak nevíš jak fungují. A napsat jednoduchý thread pool pro svůj konkrétní účel není težké, ale pokud chceš něco co mohou používat i ne tak zkušení programátoři jako ty, tak to je jiná.

A nakonec souhlas: čím jednodušší, tím kolikrat lepší. KISS.

Embarcadero MVP - Czech republic