Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaIldikó Borbélyné Megváltozta több, mint 9 éve
1
ELTE PSZT – 2008. november
2
Symbian operációs rendszer SIBO – Psion Computers (1980) EPOC - irodai kisszámítógép (1980-1998) Symbian OS – (alapítva 1998 : Nokia, Motorola, Psion, Ericsson, 2002: Sony-Ericssson, Siemens) Mérföldkő: 2000-ben megjelent 6.0-ás verzió
3
Segédanyagok www.symbian.com/books www.symbian.com/developer www.symbian.developer/public/index.html http://forum.nokia.com/main.html SDK online dokumentáció: C:\S60\devices\S60_3rd_FP2_SDK_v1.1\docs\eclipse.exe
4
Online dokumentáció
5
Okos telefonok erős processzor nagyméretű kijelző viszonylag nagy memória információ kezelő programok egyéni alkalmazások egyszerű kezelhetőség megbízhatóság erőforrásaival nem pazarló (memória, szolgáltatások, energia fogyasztás) gyors reakcióidő folyamatos üzemmód
6
Elvárosok megbízható nincs adatvesztés nem dobja el a vonalat optimális a memória felhasználás nincs memória szivárgás minden hibát „értelmesen” kezel nyitott a külső fejlesztések irányába
7
Symbian OS felépítése Java Alkalmazás szintű szolgáltatások Operációs rendszer szolgáltatásai Alap- szolgáltatások Kernel és hardware integráció MIDP CLDC JVM Felhasználói interfész szinkronizáció UI alkalmazás keretrendszer UI eszköz- készlet PIMÜzenet- kezelés BöngészésAdat- szinkron Általános szolgáltatások Kommunikációs szolgáltatások Grafikai szolgáltatások PC-s kapcsolat szolgáltatásai Alacsonyszintű szolgáltatások Fájlszerver Kernel szolgáltatások Eszközmeghajtók
8
A fejlesztés alapelemei Symbian C++ sajátosságok Elnevezési konvenciók Kivétel- és memóriakezelés Alaptípusok, sztringek, tömbök ThinTemplate minta Hibakezelés módja Aszinkron kezelés (ActiveObject)
9
Symbian C++ sajátosságok Nincs kivétel. Helyette: TRAP és User::Leave Nincs RTTI (dinamikus castolás nem megengedett) Kódolási minták a memóriaszivárgás kiszűrésére: kétfázisú konstrukció, CleanUpStack Saját elnevezési konvenciók: nem a változó típusa, hanem szerepe szerint történik az elnevezés (T,C,R,M) memóriakezelés segítése függvénynevekkel: prefixek, postfixek
10
Symbian C++ sajátosságok Nincs STL, helyette saját generikus adatszerkezeteket használ String helyett deszkriptorok Többszálúság kezelése: ActiveObject, Thread Template-ek használata: ThinTemplate
11
Elnevezési konvenciók Általános szabályok Osztályok (T,C,M,R) Egyéb típusok Változók Metódusok Osztálydeklarációk elhelyezkedése
12
Általános szabályok Típusok, változók, metódusok Angol név, amerikai angol írásmód (Color, Colour) Szavakat egybe írjuk, minden szót nagybetűvel kezdünk Osztálynevek: főnevek; metódusnevek: igék Név végén konvenció szerinti záróbetű (L, LC, LD)
13
T osztályok (Type) Egyszerű típusok Nem tárolnak heapen objektumokat Nincs szükségük destruktorra (az alapértelmezett jó) Másoló konstruktort és értékadó operátort is ritkán használ Legtöbbször a stack-en foglal helyet Nem igényelnek destruktort, ezért nem probléma, ha nem kerül végrehajtásra (leavelés).
14
T osztályok - példa
15
C osztályok (Class) Bonyolultabb funkcionalitású osztályok Ősosztálya a CBase Virtuális destruktorral KELL rendelkeznie (memória felszabadítás) Tagváltozók automatikusan kinullázódnak Birtokolnak heapen tárolt objektumokat (memóriakezelés!) Függvényhívásnál referenciaként, vagy pointerként adjuk át (nem igényelmásoló konstruktort vagy értékadó operátort) A destruktor hívását minden esetben biztosítani kell.
16
R osztályok (Resource) Valamilyen szerves szerű program által biztosított erőforrásra tartalmaznak azonosítót. (Pl. az RFile osztály az RFS osztály erőforrását használja ) „Azonosító” miatt helyet foglalhatnak a stack-en is A felszabadítás az erőforrást birtokló objektum (szerver) dolga Szál befejeződésekor automatikusan felszabadul Foglalás: Open, Create, Allocate Elengedés: Close, Destroy, Free
17
R osztályok - példa
18
M osztályok (Mixin) Interfész, absztrakt protokoll C++: absztrakt osztályok Csak virtuális metódusuk van, legtöbbször implementáció nélkül Szigorú többszörös öröklődés: egy C osztály csak egy másik C osztályból és több M osztályból örökölhet (ugyanabból az M osztályból csak egyszer)
19
Osztálytípusok - összefoglalás T: egyszerű típus; nincs destruktora; csak T-ből, vagy M-ből öröklődhet; értékként átadható; stack-en tárolható C: csak a heapen foglalható; van destruktora; pontosan egy C és tetszőleges M osztályból származhat; nem adható át értékként M: interfész; csak virtuális metódusok; nincsenek tagváltozók; nem példányosítható R: erőforrás, melyet meg kell nyitni és be kell zárni
20
Kivételek, egyéb típusok S: tagfüggvény nélküli struktúrák Statikus osztályok: User, Math, Mem H: HBufC D: Kernel oldali osztályok E: felorolások(enum) K: Konstansok i: tagváltozók (pl. iNum) a: argumentumok ( pl.: void SetNumber (TInt aNumber); )
21
Metódusok Lekérdező és beállító metódusok iNum tagváltozóhoz Num() lekérdező SetNum() beállító metódus Bonyolultabb lekérdezéshez GetNum(); „Kilépő” metódusok („Leavelő”) Azok a metódusok, amelyek közvetlenül vagy közvetve User::Leave hívást eredményezhetnek Lehetséges végződések: L, LC, LD
22
Osztálydeklarációk - egyezmények public, protected, private: mindig ki kell írni Sorrend: tagfüggvények, tagváltozók Metódusok argumentumait a deklarációban is ki kell írni Az ősosztály virtuális metódusait külön csoportosítjuk, megjelölve, honnan öröklődtek Ha sok inline függvény van, külön fájlba kell helyezni
24
Dinamikus objektumok - heap Minden szál rendelkezik saját heap területtel Symbian OS alatt a CBase osztályok példányait a heap- en helyezzük el Az osztály adattagjai létrejöttükkor kinullázódnak A virtuális destruktor biztosítja, hogy a felszabadítás helyesen megtörténjen
25
Kivételkezelés, memóriakezelés Kivételkezelési konvenciók Cleanup Stack Kétfázisú konstruktor
26
Kivételkezelés A Symbian elődjének fejlesztésekor a C++ fordítók nem ismerték a kivételkezelést A C++ kivételek többlet memóriát és több számítást igényelnek Symbian: egy-két konvenció kisebb erőforrás igény
27
Objektum automatikus létrehozása a stack-en
28
Objektum létrehozása a heapen – példa Hiba esetén abbahagyja a végrehajtást.
29
Trap Harrness és Leave
30
Kivételkezelési konvenciók C++ Symbian Throw Catch Függvénydeklaráció: Throw new operátor: 0-t ad vissza User::Leave TRAP, TRAPD záró L new (ELeave): kivételt dob, ha nincs memória
31
Kivételkezelés C++-ban Ha kivételkezelés történik A program stack visszafejtésre kerül a catch szintjéig Az objektumok destruktorai meghívódnak A mutatók „elvesznek” (esetleg smart pointert lehet használni) int e float d Object c Object *b int *a SomeThing ex
32
Kivételkezelés C++-ban Ha kivételkezelés történik A program stack visszafejtésre kerül a catch szintjéig Az objektumok destruktorai meghívódnak A mutatók „elvesznek” (esetleg smart pointert lehet használni) int e float d Object c Object *b int *a SomeThing ex
33
Kivételkezelés C++-ban Ha kivételkezelés történik A program stack visszafejtésre kerül a catch szintjéig Az objektumok destruktorai meghívódnak A mutatók „elvesznek” (esetleg smart pointert lehet használni) float d Object c Object *b int *a SomeThing ex
34
Kivételkezelés C++-ban Ha kivételkezelés történik A program stack visszafejtésre kerül a catch szintjéig Az objektumok destruktorai meghívódnak A mutatók „elvesznek” (esetleg smart pointert lehet használni) Object c : ~Object Object *b int *a SomeThing ex
35
Kivételkezelés C++-ban Ha kivételkezelés történik A program stack visszafejtésre kerül a catch szintjéig Az objektumok destruktorai meghívódnak A mutatók „elvesznek” (esetleg smart pointert lehet használni) Object *b (Elveszett: sizeof(Object) leak) int *a SomeThing ex
36
Kivételkezelés C++-ban Ha kivételkezelés történik A program stack visszafejtésre kerül a catch szintjéig Az objektumok destruktorai meghívódnak A mutatók „elvesznek” (esetleg smart pointert lehet használni) Object *b (Elveszett) int *a (Elveszett) SomeThing ex sizeof(Object) + sizeof(int) méretű memóriaszivárgás.
37
Symbian C++ hibakezelés Nincs C++ kivétel Nincs veremvisszafejtés Destruktorokat nem hívja meg Egész számot lehet eldobni és elkapni stackCleanupStack int e float d Object c Object *bObject cc.Finalize() int *aObject *bdelete b int ecodint *afree(a)
38
Hibakezelés - Leave A Symbianban a hiba kezelésére a User könyvtár Leave metódusa szolgál. Az olyan függvényeket, amelyek a User::Leave metódust hívják leave- elő függvényeknek nevezzük. Minden leave-elő függvény neve L betűre végződik. Mikor leave-elhet egy függvény? Ha közvetlenül meghívja a User::Leave() függvényt Heapen foglal helyet new (ELeave) metódussal Más leave-elő függvényt hív.
39
Hibakezelés + Leave Leave kezelése TRAP segítségével. Több függvényhívás esetén mindegyiket bele kellene tenni egy TRAP konstrukcióba. A CleanupStack használata „egyszerűsíti” ezeket a függvényhívásokat.
40
CleanupStack A UseL() függvény memóriát foglal és leave-elhet. Az x automatikus változó a heap-re mutat. Ha UseL() leave-el, akkor a delete nem hajtódik végre, a CX által lefoglalt terület „árván” marad. A CX helyfoglalása után a rá mutató pointert elhelyezzük a Cleannup Stack-en Ha UseL() nem leave-el, akkor MI szedjük le a címet a stackről. Ha UseL() leave-el, akkor a Laeve kezelő eljárás.
41
CleanupStack alkalmazása Egyszerre több elemet is leemelhetünk a stackről. Pointert tartalmazó adattagot ne tegyünk a CleanupStack-re. Az általa mutatott terület felszabadítása az adattagot tartalmazó osztály feladata, nem a Leave-elő mechanizmusé. Tilos!! A PushL() nem leave-el (előrefoglalás miatt)
43
Kétfázisú konstrukció Probléma: A CY példányosításakor a CY konstruktora leave-el!
44
Kétfázisú konstrukció
45
A konstruktort két részre bontjuk: 1. rész: Biztonságos, nem leave-elő a példányra mutató pointer biztosan felkerül a CleanupStack-re 2. rész: A „veszélyesebb” leave-elő rész. De ekkor már jó helyen van a pointer.
46
Kétfázisú konstrukció A „két fázist” a NewL, NewLC függvényekbe „becsomagolják”.
47
Kétfázisú konstrukció - összefoglalás Az osztály standard konstruktorában nem hívunk leave-elő kódot A leave-elő hívásokat egy külön „második fázisú konstruktorba” tesszük. (ConstructL) Az osztály példányosításakor: Meghívjuk a standard konstruktort (new) A „félig létrejött” objektumot feltesszük a CleanupStack-re Meghívjuk a második fázisú konstruktort (ConstructL) (Levesszük a CleanupStack-ről) A „két fázist” a NewL, NewLC függvényekbe „becsomagolják”.
48
Tagváltozók Amikor egy osztály tagváltozót hozunk létre a heapen, akkor azt nem szabad feltenni a CleanupStack-re!! Leave esetén meghívódik a gazda osztály destruktora és az törli a tagváltozót Ha emellett a CleanupStack-en is fenn lenne a tagváltozó, akkor kétszer próbálná törölni, ami HIBA.
49
Kódhatékonyság. ThinTemplate
50
Hibák elleni védekezés _ASSERT_ALWAYS _ASSERT_DEBUG User::Panic _TEST_INVARIANT _UHEAP_MARK, _UHEAP_MARKEND
51
Aszinkron szolgáltatások, ActiveObject Aszinkron események: billentyű lenyomás, i/o művelet befejeződése, időzítők jelzései, … Lépések: Igény bejelentése várakozás az eseményre reagálás az eseményre ActiveSheduler ActiveObject Prioritás OfferKeyEventL
52
Kliens-szerver keretrendszer fájlszerver ablakkezelő szerver kommunikácó kezelés adatbázis-kezelés határidőnapló A CServer osztályból származnak.
53
Cleanup-safe HelloWorld Konzolos alkalmazásnál a CleanupStack-et nekünk kell létrehozni.
54
Fájlkezelés – console alkalmazás
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.