340 likes | 551 Views
Symbian ohjelmointi. 4. Luento Juha Turunen (juha.turunen@lut.fi). Sisältö. Asynkroninen ohjelmointi Active object framework S60 UI. Asynkroninen ohjelmointi. Synkroninen Blocking Helppoa Joskus tehotonta Asynkronisen ohjelman tekeminen synkronisilla kutsuilla vaatii useita säikeitä
E N D
Symbian ohjelmointi • 4. Luento • Juha Turunen (juha.turunen@lut.fi)
Sisältö • Asynkroninen ohjelmointi • Active object framework • S60 UI
Asynkroninen ohjelmointi • Synkroninen • Blocking • Helppoa • Joskus tehotonta • Asynkronisen ohjelman tekeminen synkronisilla kutsuilla vaatii useita säikeitä • Asynkroninen • Tehokasta • Pyyntö valmistuu joskus tulevaisuudessa eikä heti (vrt synkroninen kutsu)
Asynkroniset pyynnöt • Pyynnöt (requests) • Esim. näppäimen painallus, uutta dataa sarjaportista, tiedostoon kirjoitus valmis, jne... • Jokaisella säikeellä on semafori • Semaforia kasvatetaan aina kun kernel signaloi säikeelle pyynnön valmistumisesta • Mahdollistaa peräkkäin valmistuvat pyynnöt • User::WaitForAnyRequest() • Vähentää joka kutsulla semaforin arvoa yhdellä • Jos semaforin arvo menee negatiiviseksi, joutuu säie sleep tilaan ja kernel jatkaa säikeen suoritusta vasta kun jokin pyyntö valmistuu
Asynkroniset pyynnöt • TRequestStatus • Kapseloi pyynnön tilan • KRequestPending • RThread::RequestComplete() • Asynkroniset palvelun tarjoajat ottavat yleensä parametrikseen TRequestStatus viittauksen, jolla ne signaloivat pyynnön tekijälle pyynnön valmistuessa • Esim RTimer::After( TRequestStatus& aStatus, …) • User::WaitForRequest( TRequestStatus& aStatus);
Event loop • Odottaa, että jotain tapahtuisi ja käsittelee valmistuneet pyynnöt • Jos pyyntöjä ei ole valmistunut, pysyy säie sleep tilassa eikä kernelin tarvitse ajaa sitä turhaan
Event loop while (!Finished()) { // handle events until finished // wait for any request to complete User::WaitForAnyRequest(); // wait for any request to complete // identify and handle the completed request if (iKeyPressed!=KRequestPending) HandleKeyPressed(); else if (iReceiveCompleted!=KRequestPending) HandleReceiveCompleted(); else if (iTransmitCompleted!=KRequestPending) HandleTransmitCompleted(); else { /* panic! */ } // something we didn’t expect! }
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
S60 UI • Suunniteltu tiedon selaamiseen, ei tuottamiseen • Tieto esitetään pääasiassa listoissa ja taulukoissa • Mukautuu erillaisiin näytön kokoihin ja muotoihin • 2nd edition FP3 • Skaalautuvat ikonit • Tiedon syöttö ITU-T näppäimillä (+T9) tai QWERTY näppäimistöllä (2nd ed FP3)
Skaalautuva UI • Sovelluksen täytyy ottaa ruudun koko ja muoto huomioon • Mikäli sovellus käyttää valmiita UI-komponentteja voi vaikutussa olla suhteellisen pieni • Skaalautuvat ikonit ovat vektorigrafiikkaa, joka rasteroidaan lennossa kullekin resoluutiolle sopivaksi
Tyypillisen S60 UI:n rakenne Status pane Main pane Control pane
1 Status pane 4 3 2 • Status pane jakautuu osiin • Title pane • Navigation pane • Battery pane • Signal pane • Context pane • Indicator pane • Osa applikaationomistuksessa 5 6
Main pane • Yleensä joko koko main panen kokoinen valmis komponentti (esim. lista) tai jokin custom näkymä (esim. Clock)
Controlpane • Softkeyt • Määritellään pareittain • Softkey voi olla myös tyhjä • Jokaisella softkeyllä command ID • Valmiita pareja määritelty <avkon.rsg>:ssä • Esim. R_AVKON_SOFTKEYS_OPTIONS_BACK CAknAppUI::SetCommandSetL( R_MY_SOFTKEYS ); RESOURCE CBA r_my_softkeys { buttons = { CBA_BUTTON { id = EJuttu; txt = ”Juttu”; }, CBA_BUTOON { id = EHomma; txt = ”Homma”; } }; } • Scroll indicator
Navigation pane • Vaihtoehdot • Tabit • Teksti • Kuva • Volume indikaattori • Tyhjä (väri gradient)
Listboxit • AVKON toteuttaa lähes 30 erillaista listatyyppiä • Toteuttavat luokat muotoa CAknXxxxxListBox • Kaikki listbox luokat perivät viimekädessä CEikTextListBox -luokasta (ja sitä kautta myös CEikListBox –luokasta)
Listbox model • Listbox model toimii datan tuottajana listboxille • Kaikki listatyypit käyttävät modelina MDesCArray –rajapintaa • Listboxin data voi tulla mistä tahansa MDesCArray:sta peritystä luokasta. • Esim. CDesCArraySeg tai CMyPlayerListModel • TInt MDesCArray::MdcaCount() • TPtrC MDesCArray::MdcaPoint( TInt aIndex )
Listojen formatointi • Jokaisen listan itemin kuvaa yksi deskriptori listan modelissa (MDesCArray) • Jokaisella listatyypillä on oma dataformaatti • Osiot erotellaan tabulaattorilla (\t) • Esim.CAknDoubleLargeStyleListBox • ”1\tImage(04)\t15.03.2003 – 16:41\t0” • ”5\tJotain sekoilua\t19\t0” • Yleisesti ottaen formatointi menee • <ikoni>\t<ensimmäinen teksti>\t<toinen teksti>\t<ikoni> • Mikäli ikoneita ei listatyypissäole jätetään indeksi pois, mutta tabulaattori säilyy!
Esimerkki listboxin käytöstä • Halutaan tarjota valintalista listboxilla • Kaapataan OK –näppäimen painallus containerin OfferKeyEventL metodissa • CEikListBox::CurentItemIndex() • Haetaan model:lta alkio samalla indeksillä • Tehdään jotain...
Popup list • CAknPopupList • Näyttää olemassa olevan listboxin popup kehysten sisässä • NewL() konstruktori ottaa parametrina minkä tahansa CEikListBox:sta perityn listan, Softkey resurssin ja layoutin • Käyttäjä tuhoaa listbox olion • ExecuteLD()
Gridit • Toimivat kuten listboxit, mutta näyttävät itemit ruudukossa ja navigoituvat neljässä suunnassa • Sama kantaluokka kuin listoilla
Notifications • CAknNoteDialog • Wrapperit • Confirmation note • Warning note • Information note • Error note • Wait note • Progress note • Noteja voidaan näyttää joko CAknNoteDialog-luokkaa ja DIALOG resurssia käyttäen tai wrapper-luokkien avulla • Resurssilla voi määrittää itse ikonin ja layoutin • Wrapper helpompi käyttää
Confirmation note • Kertoo käyttäjälle onnistuneesta operaatiosta • Lyhyt kesto + pieni ääni • Wrapper-luokka CAknConfirmationNote
Information note • Kertoo käyttäjälle odottamattomasta tapahtumasta • Pidempi kesto ja kovempi ääni kuin confirmation notella • Wrapper-luokka CAknInformationNote
Warning note • Varoittaa käyttäjää tilanteesta, joka saattaa vaatia toimenpiteitä • Esim. akku lopussa, muisti vähissä, jne... • Wrapper-luokka CAknWarningNote
Error note • Kertoo käyttäjälle vakavasta virheestä • Esim. väärä salasana, tiedostoa ei voida tuhota, muisti lopussa, jne... • Wrapper-luokka CAknErrorNote
Wait note & progress note • Kertoo käyttäjälle, että käynnissä on pitkäkestoinen operaatio • Animaatio tai progress bar • Luonteeltaan asynkroninen • Käyttö hankalampaa kuin muilla noteilla • MProgressDialogCallback
Queryt • Datan keräämiseen, jonkin toiminnan varmistamiseen, yms... • Local vs. global query • Confirmation query • Data query • List query