Autor Téma: Ukončení aplikace  (Přečteno 2999 krát)

Offline Fala

  • Plnoletý
  • ***
  • Příspěvků: 168
  • Karma: 2
    • Verze Delphi: XE2
    • Software pro poskytování technické podpory
Ukončení aplikace
« kdy: 08-12-2013, 17:53:40 »
stal se mi takový problém.
Občas při ukončení programu se hlavní formulář zavře, ale v task manageru stále běží program a bere 50% procesoru. když to debuguji, tak to dojde na konec projektu a dál už to nejde debugovat.
Pokud se mi to podaří chytit v debugu, tak v threadech stále běží 2 procesy, které nejsou moje. Všechny své thready mám korektně ukončené.
už si s tím lámu hlavu celý víkend a tak jsem si říkal, že jste mi už mnohokrát doře poradili, jestli by vás něco nenapadlo.

jde to nějak natvrdo ukončit?

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ukončení aplikace
« Odpověď #1 kdy: 08-12-2013, 18:26:43 »
jde to nějak natvrdo ukončit?
Neco natvrdo sestrelovat by mela byt a posledni moznost, spis  projev zoufalosti nez technickeho reseni...

To se tyka Opice nebo VCL?

Offline Fala

  • Plnoletý
  • ***
  • Příspěvků: 168
  • Karma: 2
    • Verze Delphi: XE2
    • Software pro poskytování technické podpory
Re:Ukončení aplikace
« Odpověď #2 kdy: 08-12-2013, 20:06:52 »
já jsem zoufalý a tohle přesně si uvědomuji.
problém je v tom, že jsem do toho projektu udělal docela dost zásadních změn a nahrál HotFix
je to opice XE2

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ukončení aplikace
« Odpověď #3 kdy: 08-12-2013, 20:36:33 »
Občas při ukončení programu se hlavní formulář zavře, ale v task manageru stále běží program a bere 50% procesoru.
Znamena to, ze zavres main form a jeho destruktor se vykona pred tim, nez to dorazi na end. v souboru .dproj? Je nejaky rozdil v chovani, kdyz bys main form nechal otevreny a chcipnul aplikaci tj. main form by se rusil az jako soucast exit chainu v Application.DestroyComponents;


když to debuguji, tak to dojde na konec projektu a dál už to nejde debugovat.
Co je to konec projektu? Kdyz si udelas debug konfiguraci se zapnutym Use Debug DCUs a das si breakpoint na posledni end. v .dproj souboru, tak az to dorazi na ten breakpoint, musi jit vtrasovot do exit chainu v unit system tj. do cyklu, ktery vypada nejak takhle:
Kód: Delphi [Vybrat]
  1.     while ExitProc <> nil do
  2.     begin
  3.       @P := ExitProc;
  4.       ExitProc := nil;
  5.       P;
  6.     end;
  7.  
ktery ti jednak zajisti destrukci vsech existujicich formularu, datamodulu aj. v tom Application.DestroyComponents a dvak ti zavola vsechnu Finalization bloky be vsechn unitach v projektu, nejen tech tvych. Tak to trpelive zkus protrasovat a sledovat, jestli se nedeje neco podezreleho. Nejlepe se to dela tak, ze si vsimas unit, ktere se ti oteviraji v IDE a davas si do nich breakpointy, abys to nemusel, az ti to treba nekde utece, nemusel trasovat vsechno od zacatku ale od posledniho breakpointu.

Podle me by se melo dat zjistit, kde a proc to zustane viset.

Offline Fala

  • Plnoletý
  • ***
  • Příspěvků: 168
  • Karma: 2
    • Verze Delphi: XE2
    • Software pro poskytování technické podpory
Re:Ukončení aplikace
« Odpověď #4 kdy: 09-12-2013, 12:28:59 »
ten parametr debuggeru jsem měl nastavený, ale nešel jsem dovnitř bo tam vyskočil assembler. Když ale dáš SHIFT+F8, tak to opravdu vběhne do zmiňovaného kódu.

Končí mi to na
    FinalizeUnits;

všechno jsem to prošel a nic závadného tam nemám. jinak tam je asi 600 unit, tak to odkrokovat bude makačka

Offline Fala

  • Plnoletý
  • ***
  • Příspěvků: 168
  • Karma: 2
    • Verze Delphi: XE2
    • Software pro poskytování technické podpory
Re:Ukončení aplikace
« Odpověď #5 kdy: 09-12-2013, 12:37:36 »
tak jsem to našel, je to system.sysutils a  metoda
procedure DoneMonitorSupport;

a konkrétně to zatuhne na
  CleanEventList(SyncEventCache);

Offline Fala

  • Plnoletý
  • ***
  • Příspěvků: 168
  • Karma: 2
    • Verze Delphi: XE2
    • Software pro poskytování technické podpory
Re:Ukončení aplikace
« Odpověď #6 kdy: 09-12-2013, 12:54:18 »
ja to tady radí,
http://stackoverflow.com/questions/14217735/application-hangs-in-sysutils-donemonitorsupport-on-exit

tak jsem upravil sysutils (zkopíroval jsem zmiňované soubory do projektu a upravil. orig sysutils je na svém místě)

  procedure CleanEventList(var EventCache: array of TSyncEventItem);
  var
    I: Integer;
  begin
    for I := Low(EventCache) to High(EventCache) do
    begin
{$IFDEF VER230}
      if InterlockedCompareExchange(EventCache.Lock, 1, 0) = 0 then
         DeleteSyncWaitObj(EventCache.Event);
{$ELSE}
      repeat until InterlockedCompareExchange(EventCache.Lock, 1, 0) = 0;
      DeleteSyncWaitObj(EventCache.Event);
{$ENDIF}
    end;
  end;


a už se zdá, že se to ukončuje korektně.