Forum Delphi.cz

Delphi => Firemonkey => Téma založeno: Fala 08-12-2013, 17:53:40

Název: Ukončení aplikace
Přispěvatel: Fala 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?
Název: Re:Ukončení aplikace
Přispěvatel: pf1957 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?
Název: Re:Ukončení aplikace
Přispěvatel: Fala 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
Název: Re:Ukončení aplikace
Přispěvatel: pf1957 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.
Název: Re:Ukončení aplikace
Přispěvatel: Fala 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
Název: Re:Ukončení aplikace
Přispěvatel: Fala 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);
Název: Re:Ukončení aplikace
Přispěvatel: Fala 09-12-2013, 12:54:18
ja to tady radí,
http://stackoverflow.com/questions/14217735/application-hangs-in-sysutils-donemonitorsupport-on-exit (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ě.