1 / 11

Symbian ohjelmointi

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

mills
Download Presentation

Symbian ohjelmointi

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Symbian ohjelmointi • Ti5315200 Symbian ohjelmointi • 5. harjoitus • Juha Turunen (juha.turunen@lut.fi)

  2. Sisältö • Active object framework

  3. 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

  4. 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

  5. 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; };

  6. 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

  7. 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()

  8. 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

  9. 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

  10. 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.

  11. 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

More Related