Autor Téma: "Neobjektové" unity  (Přečteno 2298 krát)

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
"Neobjektové" unity
« kdy: 06-08-2014, 16:09:44 »
Dobrý den pánové,
jak se chová program, kde jsou v uses klasické unity bez tříd, dědičností a podobných věcí, když v oné unitě nedej bože spadne?
Mám zatím takovou představu, že pokud pád nastane v nějaké formulářové unitě, která vytvoří form a vše okolo, tak při pádu po sobě uklidí. Ale jak je to těch ostatních?
Samozřejmě, že používám try bloky, ale možností pádu je moc a jdou až do ovladačů.
Dělám obecnou měřicí aplikaci, která by měla poznat, co je na ni připojeno a podle toho konfigurovat použité měřicí zařízení, tak mi přišlo vhodné udělat jeden formulář,
jednu unitu s veřejnými deklaracemi a pro každý přístroj jednu unitu s ovládáním. Nechci nic deklarovat za běhu.

Dalibor.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3554
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:"Neobjektové" unity
« Odpověď #1 kdy: 06-08-2014, 16:52:25 »
> když v oné unitě nedej bože spadne
neexistuje ze by to spadlo v "unite". Vzdy to max. spadne v nějaké proceduře nebo metodě, která je v nějaké unitě.

 V takovém případě, kdy dojde k neodchycené vyjimce se provede propagace vyjimky do nadřízené funkce (metody) podle volání uložených na zásobníku - v anglictine unwind stack.

Postupuje se zpet, tak dlouho dokud se nenarazí na nejaký blok try except. Pokud se na něho nenarazí, skončí to v globálním ovladači vyjimek, který většinou instaluje RTL. Ted si nejsem jist zda ho instaluje jen v případě VCL (FMX) aplikace (to je ten co vypise message box pri vyjimce), nebo přímo při použití Classes .

Pokud se nenajde globalni ovladač, skončí to v DPR, kde většinou bývá try - except. Pokud tam není, tak to Windows ohlásí že aplikace provedla neplatnou operaci atd.

Pokud používáš vlákna, tak neodchycená vyjimka ve vláknu odstrelí vlákno (a vetsinou to skončí nějakou hláškou Windows o neplatné operaci a program bude ukončen - Dr. Watson atd.).
« Poslední změna: 06-08-2014, 17:03:04 od Radek Červinka »
Embarcadero MVP - Czech republic

Offline Daniel_Andrascik

  • Guru
  • *****
  • Příspěvků: 590
  • Karma: 20
    • Verze Delphi: D2007, D10.4
Re:"Neobjektové" unity
« Odpověď #2 kdy: 06-08-2014, 23:09:22 »
tak ako hovori radek, vynimka vzniknuta hoci aj niekde v utrobach sa ti vzdy vracia. Nemusis sa bat nejakej "ciernej diery" ze ti program bez vysvetlenia skolabuje koli nejakej "hlbokej" vynimke. Stava sa to vsak pri chybnom prepisovani pamate (napriklad zapis do premennej typu pole napr. MyArr[ItmIdx] := 100, pricom ItmIdx bude mat vacsiu hodnotu ako je rozmer pola atd...). Vtedy vznikaju prapodivne vynimky na miestach na ktorych by si to absolutne necakal. V kazdom pripade je velmi vhodne pouzivat nejaky z exception managerov ako napr. EurekaLog, MadExcept, JCLdebug a pod a ktomu este nejaky kvalitny pamatovy manager typicky FastMM. Poskytnu ti o vynimkach mnoho cennych informacii. Pouzivam ich v kazdom jednom projekte aj napriek tomu ze zvycajne zvacsuju velkost exaca a niekedy mozu aj mierne ovplyvnit vykon aplikacie, ale rozhodne sa oplati. Pamatovy manager FastMM ten vie pri optimalnom nastaveni aplikaciu zase zrychlit. V novych delphi je jeho jadro uz integrovane

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:"Neobjektové" unity
« Odpověď #3 kdy: 07-08-2014, 08:43:25 »
Dik pánové.
Dalibor.
Dalibor (D2009 Enterprise, dřív D5Enterprise)