symbian ohjelmointi
DESCRIPTION
Symbian ohjelmointi. Ti5315200 Symbian ohjelmointi 5. harjoitus Juha Turunen ([email protected]). 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 - PowerPoint PPT PresentationTRANSCRIPT
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 eventvirtual void RunL() =0; // Handle an Eventvirtual 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
2. Create AO & issue request& add to Active Scheduler
Active Object
5. Start Active Scheduler
Active Scheduler
3. Issues request functionset iActive true
Service Provider
4. set object’s iStatus to KRequestPending
6. request completed: reset object’s iStatus e.g. KErrNone
5. WaitForAnyRequest()
1. Create and Install Active Scheduler
7. call AO’s RunL()8. RunL() function re-issues request or stops active scheduler
Cleanup and terminate
Key
Procedural flow:
Control transferred:
(asynchronous)
(service runs and completes)
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
Notifier
Observer1
Observer2
NotifierObserver1
Observer2Observer interface<<inherits>>
Ei näinVaan näin
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