110 likes | 268 Views
Symbian ohjelmointi. Ti5315200 Symbian ohjelmointi 5. harjoitus Juha Turunen (juha.turunen@lut.fi). Sisältö. Active object framework. Active object framework. Symbian OS on luonteeltaan asynkroninen Suurin osa ajasta kuluu käyttäjän tai järjestelmätapahtumien odottamiseen Idle state
E N D
Symbian ohjelmointi • Ti5315200 Symbian ohjelmointi • 5. harjoitus • Juha Turunen (juha.turunen@lut.fi)
Sisältö • Active object framework
Active object framework • Symbian OS on luonteeltaan asynkroninen • Suurin osa ajasta kuluu käyttäjän tai järjestelmätapahtumien odottamiseen • Idle state • Active objectit tarjoavat tavan moniajaa säikeen (thread) sisällä • Vähemmän säikeitä => turvallisempaa koodia, vähemmän kulutettuja järjestelmäresursseja • Yhteistyömoniajo • Kapseloi perinteisen event loopin
Active object framework luokat • CActive • Kapseloi pyynnön • Kapseloi pyynnön valmistumisen käsittelyn • Kapseloi pyynnön peruuttamisen • TRequestStatus • CActiveScheduler • Kapseloi wait loopin • Yksi per säie • Prioriteetit • Ajaa jokaista active objectia (jolla on valmistunut pyyntö) vuorollaan
CActive • Kaikkien active objectien kantaluokka class CActive : public CBase { public: void Cancel(); // Cancel outstanding wait void SetPriority(TInt aPriority); TInt Priority() const; TRequestStatus iStatus; protected: CActive(TInt aPriority); void SetActive(); virtual void DoCancel() =0; // Cancel event virtual void RunL() =0; // Handle an Event virtual TInt RunError(TInt aError); private: TBool iActive; };
Valmiita active objecteja • CIdle • Jatkuvan tausta-ajon toteuttamista varten • Esim. iso laskenta operaatio mikä täytyy pystyä canceloimaan • Kuvitteellinen pyyntö aina valmis • CPeriodic • Ajastin • CHeartbeat • Kuten CPeriodic, mutta sisältää synkronointi mahdollisuuden
DIY Active object • Peri CActive luokka • Toteuta DoCancel() ja RunL() • Yleensä RunL:stä kutsutaan jotain abstraktia rajapintaa (observer) • Toteuta RunError() mikäli virhekäsittelyä tarvitaan • Määrittele ja toteuta metodit, joilla tehdään pyyntö • SetActive() • Tee asynkroninen pyyntö • iStatus • Luo instanssi ja lisää se ActiveScheduleriin • CActiveScheduler::Add()
Active object elinkaari Application 1. Create and Install Active Scheduler Service Provider Active Object 4. set object’s iStatus to KRequestPending 2. Create AO & issue request & add to Active Scheduler 3. Issues request function set iActive true 5. Start Active Scheduler (service runs and completes) Active Scheduler 6. request completed: reset object’s iStatuse.g. KErrNone 5. WaitForAnyRequest() (asynchronous) Key Procedural flow: Control transferred: 8. RunL() function re-issues request or stops active scheduler 7. call AO’s RunL() Cleanup and terminate
Observer pattern • Observer pattern toteuttaa yksi moneen suhteen olioiden välillä • Olio viestittää observer olioille (tai oliolle) oman tilansa muuttumisesta • Jos viestittävään luokkaan olisi kovakoodattu konkreetit observer luokat, olisi viestittävä luokan laajentaminen työlästä ja sidottua tiettyyn oliomalliin • Määrittelemällä observereille abstrakti rajapinta Vaan näin Ei näin Notifier Observer1 Observer1 Notifier Observer interface <<inherits>> Observer2 Observer2
Harjoitustehtävä • Tehtävänä on tehdä active object, joka tekee asynkronisen pyynnön RTimer luokkaa käyttäen • Active object luokka viestii observer rajapinnan kautta toiselle oliolle pyynnön valmistumisesta • Monikäyttöisyys • Huomaa, että normaalisti vastaavanlaisen asynkronisen viiveen voi hoitaa näppärästi CPeriodic tai CTimer luokkaa käyttämällä, mutta tässä harjoituksessa teemme active objectin itse • Jos esim. harjoitustyötä tehdessä tarvitsee käyttää asynkronisia palveluita, hoituu homma samalla. Vain palveluntarjoaja vaihtuu.
Ohjeet harjoitustehtävän tekoon • Aloita luomalla käännösympäristö ja kääntämällä ohjelma • Aja sovellus ja kokeile ensimmäistä menu valintaa (’synchronous’) • Tutki suoritettavaa koodia (CAOProbAppUI::HandleCommandL) • Kuinka UI toimii synkronisen operaation aikana? • Täydennä puuttuva koodi CActiveDelay luokan metodeihin • Täydennä puuttuva koodi CAOProbAppUI luokan metodeihin • ConstructL() • HandleCommandL() • Kokeile asynkronisia kutsuja (’asynchronous1’ ja ’asynchronous2’ menusta) • Varmista, että eventhandlerit tulostavat info viestit ruudulle viiveen kuluttua • Kuinka UI toimii asynkronisten kutsujen aikana? • Varmista, että cancel toiminto toimii