Autor Téma: Ignorace Synchronize  (Přečteno 1949 krát)

Offline raul

  • Plnoletý
  • ***
  • Příspěvků: 167
  • Karma: 9
    • Verze Delphi: FPC :D
Ignorace Synchronize
« kdy: 18-07-2016, 13:50:02 »
Zdar a silu,

mam vlakno, ktere komunikuje po TCP, dostane obrazek (zakodovany), ten rozkoduje a chce ho zobrazit na MainForm.

Kousek kodu prijeti :
      fLastReceivedJpegFileName := fn;
      Synchronize(@PreviewImage);

PreviewImage pak vypada takto

  try
    Log('Loading image : ' + fLastReceivedJpegFileName);
    uMainForm.Form1.PreviewImage.Picture.LoadFromFile(fLastReceivedJpegFileName);
    uMainForm.Form1.PreviewImage.Update;
  except
    on E: Exception do
      Log('Error loading image : ' + E.Message);
  end;

Legracni na tom je, ze mi obcas (zatim nedokazu rict kdy) prestanou tyhle synchronize fungovat a PreviewImage se vubec nespusti. Dela mi to i u dalsich method jako aktualziace rozhrani dle instrukci z TCP apod. Proste zatim mohu rict, ze ze zacatku to jede a po nejake dobe prestane. Zajimavy je ovsem log, ktery prestane fungovat pouze z nekterych vlaken (vlakna vsak cinnost vykazuji dale), ale z jinych vlaken log beha jak ma.

Jak vlastne funguje synchronize a nema nejake pozadavky, ktere bych nedopatrenim pos... ?

Pardon za detinskost dotazu, ale spis pise servere veci, takze z GUI jsem prisel do styku pred 15 lety :D
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1744
  • Karma: 77
    • Verze Delphi: D2007, XE3, DX10
Re:Ignorace Synchronize
« Odpověď #1 kdy: 18-07-2016, 14:01:03 »
Jak vlastne funguje synchronize a nema nejake pozadavky, ktere bych nedopatrenim pos... ?
Funguje tak, ze thread posila zpravu (nechce se mi to hledat, ale tusim WM_NULL) do fronty hlavnimu threadu, jako parametr mu preda handle na event a ceka, az hlavni thread signalizuje, ze zpravu zpracoval. Takze v hlavnimu threadu musi jet pumpa zprav, jinak se to deadlockne (pamatuji si, ze neni to tak dlouho, co tu nekdo upenlive honil deadlock zpusobeny nejakym synchronnim volanim v INDY pri disconnect, takze na vinne muze byt buhci co.)

Jeste je mozne misto Synchronize() volat Queue(), tak thread neceka na zpetnou vazbu ale jen zaradi do fronty pozadavek, ktery se ma poslat do hlavniho threadu.

Offline raul

  • Plnoletý
  • ***
  • Příspěvků: 167
  • Karma: 9
    • Verze Delphi: FPC :D
Re:Ignorace Synchronize
« Odpověď #2 kdy: 18-07-2016, 15:23:23 »
Pak to tedy vypada, ze tu zpravu obcas neodesle, kdyz hlavni vlakno dale reaguje (neni kousle) a reaguje i na jiny typ zprav (z jinych vlaken). Jako legracni je, ze mi to prijde, ze to jen ignoruje casem nektere zpravy. Protoze z jednoho vlakna treba LOG (Memo) aktualizuje jak ma, ale jine komponenty se neaktualizuji (image preview treba, ale i jine).

Bohuzel aplikace je relativne slozita na to, udelat maly test s podobnym chovanim/prostredim.
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1744
  • Karma: 77
    • Verze Delphi: D2007, XE3, DX10
Re:Ignorace Synchronize
« Odpověď #3 kdy: 18-07-2016, 16:53:25 »
ale spis pise servere veci, takze z GUI jsem prisel do styku pred 15 lety :D
Doufam, ze pouzivas taky 15 let stasrou verzi Delphi? Uz si to nepamatuju, ale nekde mezi D5 a D6 menili implementaci - v te novejsi implementaci doplnili frontu zprav (asi proto, aby se neztracely)

Offline raul

  • Plnoletý
  • ***
  • Příspěvků: 167
  • Karma: 9
    • Verze Delphi: FPC :D
Re:Ignorace Synchronize
« Odpověď #4 kdy: 18-07-2016, 17:09:38 »
FPC 3.0 a Lazarus 1.6 :D
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1080
  • Karma: 36
    • Verze Delphi: 7, 2010
Re:Ignorace Synchronize
« Odpověď #5 kdy: 18-07-2016, 17:25:23 »
Něco jako ignorace neexistuje. Prostě si to udělal špatně :)
Nevyskočí ti někde chyba a nepřeskočí to synchronizaci a pak si to vesele jede další kolo cyklu?

Offline raul

  • Plnoletý
  • ***
  • Příspěvků: 167
  • Karma: 9
    • Verze Delphi: FPC :D
Re:Ignorace Synchronize
« Odpověď #6 kdy: 18-07-2016, 19:12:35 »
Zadna chybka nevyskoci, proste jakoby ten radek byl jen ignorovan - Synchronize(@PreviewImage); - ovsem jen nekdy.  Ted mi program bezel dele a po nejaky dobe se opet prestal ignorovat. Pritom jine synchronize z jinych vlaken v te dobe bezelo jak melo a hlavni vlakno odpovidalo.
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1080
  • Karma: 36
    • Verze Delphi: 7, 2010
Re:Ignorace Synchronize
« Odpověď #7 kdy: 18-07-2016, 19:27:31 »
A nějaký log v různých částech vlákna nemáš, abys sledoval, kde ti to prochází a že ti to opravdu "přeskočí"?
My to asi těžko najdem.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1744
  • Karma: 77
    • Verze Delphi: D2007, XE3, DX10
Re:Ignorace Synchronize
« Odpověď #8 kdy: 18-07-2016, 20:20:43 »
FPC 3.0 a Lazarus 1.6 :D
No nazdar  :D Podival bych se do jeho zdrojovek na tridu TThred, jak ma implementovano predavani pozadavku do hlavniho threadu. Protoze mam dojem, ze prave do D5 vcetne to vypadalo tak, ze tam byla promenna na jednu message, pres kterou se komunikovalo s hlavnim threadem a ta se v pripade pozadavku z ruznych threadu prepisovala. Od D6 tam pridali FIFO na pozadavky, aby se jim nic neztracelo, pozdeji jeste pridali Queue (nepamatuju si kdy), ktere se do te doby muselo obchazet PostMessage().

Tak treba je ten Lazarus out of date, zejmena kdyz ten mechanismus je zavisly na platforme.

Jestli to Lazarus umitak muzes zkusit misto Synchronize zavolat Queue - tim si vynutis vlozeni do fronty a poster nebude cekat, az to hlavni thread zpracuje, takze by se to navic melo zrychlit (za predpokladu, ze tu frontu nezahltis a nepotrebujes na vysledek zpracovani cekat)

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1744
  • Karma: 77
    • Verze Delphi: D2007, XE3, DX10
Re:Ignorace Synchronize
« Odpověď #9 kdy: 18-07-2016, 20:33:03 »
Pak to tedy vypada, ze tu zpravu obcas neodesle, kdyz hlavni vlakno dale reaguje (neni kousle) a reaguje i na jiny typ zprav (z jinych vlaken). Jako legracni je, ze mi to prijde, ze to jen ignoruje casem nektere zpravy. Protoze z jednoho vlakna treba LOG (Memo) aktualizuje jak ma, ale jine komponenty se neaktualizuji (image preview treba, ale i jine).
No to by prave mohlo odpovidat nejakemu prepisovani te promenne, ktera si pamatuje pozadavek na hlavni thread pocinaje Synchronize() a konce resume threadu, ktery cekal na globalni event v te promenne. A protoze je event globalni, tak je jedno, kolik threadu na ni ceka a nic se nekousne, jen se nahodile budou ztracet nektere zpravy. Taky tam muzou mit nejakou botu.

Citace
Bohuzel aplikace je relativne slozita na to, udelat maly test s podobnym chovanim/prostredim.
Melo by stacit do tracelogu zapsat pozadavek pred Synchronizace() a po nem, vse s nejakym ID threadu, abys thready poznal od sebe. (v nasem frameworku mam thread, ktery mel unikatni jmeno prave pro potreby logovani). No pak zkontrolovat, jestli se ti "nekrizi" before-after ruznych threadu (coz by indikovalo to prepisovani globalni promenne).

Taky my se dal udelat nejaky globalni sekvencni generator pres kritickou sekci, kterym by sis cisloval vsechny pozadavky na Synchronize a v contextu hlavniho threadu bys je logoval - meli by byt cislovany spojite.
« Poslední změna: 18-07-2016, 20:34:57 od pf1957 »

Offline raul

  • Plnoletý
  • ***
  • Příspěvků: 167
  • Karma: 9
    • Verze Delphi: FPC :D
Re:Ignorace Synchronize
« Odpověď #10 kdy: 18-07-2016, 23:06:29 »
Diky za podnety, projdu vse mozne co zde padlo. Projiti logu jsem nechal na pozdeji - ono se to totiz stane treba po par tisicich synchronize, automat vraci po tcp stavy a ty maj "ledky" na formu. Obcas prijde log message, obcas pak obrazek. Takhle to bezi treba pul hodinky (pocet synchronize muze byt v te dobe par tisic a v realu nikdo moc nevidi OD TED to nejde, protoze stavy jsou relativne nahodile). V realu se na to prislo protoze se to dlouho prapodivne nehejbalo, a v logu nebyly urcite typy zprav (ktere jsou treba po jinych apod).

Myslim ze pf1957 bude mit dobrej napad s tim prepisovanim queue. Diky tomu, ze to stiha a ze synchronize neumoznuje predat JEDNODUSE parametry, tak jsem rad, ze synchronize ceka na dokonceni update method.
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1744
  • Karma: 77
    • Verze Delphi: D2007, XE3, DX10
Re:Ignorace Synchronize
« Odpověď #11 kdy: 19-07-2016, 07:12:20 »
Projiti logu jsem nechal na pozdeji - ono se to totiz stane treba po par tisicich synchronize, automat vraci po tcp stavy a ty maj "ledky" na formu.
A jak chces zjistovat, co se ti tam deje a co mas vlastne hledat?  :o Pokud mas aspon trochu rozumne zvoleny format logu, tak prece neni problem pomoci regexu odfiltrovat co te nezajima, nehlede na to, ze pokud bys pouzil sekvencni generator a logoval do extra souboru, tak nepotrebujes ani nic filtrovat...
 

Offline raul

  • Plnoletý
  • ***
  • Příspěvků: 167
  • Karma: 9
    • Verze Delphi: FPC :D
Re:Ignorace Synchronize
« Odpověď #12 kdy: 19-07-2016, 09:05:54 »
Generator a simulace je v tomhle asi jedine rychlejsi reseni. Filtrovat "nahodna" data realneho logu moc nepujdou, leda precist a koukat, kdy je tech zprav najednou mene.
Abych si vsak usetril praci, ptal jsem se, jestli to nema nejaky zadrhel, ktery neni v dokumentaci (napriklad ten pocet zprav jak si zminil) apod.
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1080
  • Karma: 36
    • Verze Delphi: 7, 2010
Re:Ignorace Synchronize
« Odpověď #13 kdy: 19-07-2016, 09:51:44 »
Zkoušel jsem spustit 50 vláken, jednoduše přičítat a pak synchronizovat (každých 10ms). Pokud by se něco ztrácelo, tak by se to ukázalo.
Ve zdrojácích je dohledatelné, že používají frontu. Hledej chybu jinde.

Offline raul

  • Plnoletý
  • ***
  • Příspěvků: 167
  • Karma: 9
    • Verze Delphi: FPC :D
Re:Ignorace Synchronize
« Odpověď #14 kdy: 19-07-2016, 10:22:30 »
Diky.. Hledam a hledam. Zkusim asi ten syntetickej test simulace zdroje dat abych presneji zjistil co a jak.
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):