1 / 34

Symbian ohjelmointi

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ä

berg
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 • 4. Luento • Juha Turunen (juha.turunen@lut.fi)

  2. Sisältö • Asynkroninen ohjelmointi • Active object framework • S60 UI

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

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

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

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

  7. 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! }

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

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

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

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

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

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

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

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

  16. Tyypillisen S60 UI:n rakenne Status pane Main pane Control pane

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

  18. Main pane • Yleensä joko koko main panen kokoinen valmis komponentti (esim. lista) tai jokin custom näkymä (esim. Clock)

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

  20. Navigation pane • Vaihtoehdot • Tabit • Teksti • Kuva • Volume indikaattori • Tyhjä (väri gradient)

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

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

  23. 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!

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

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

  26. Gridit • Toimivat kuten listboxit, mutta näyttävät itemit ruudukossa ja navigoituvat neljässä suunnassa • Sama kantaluokka kuin listoilla

  27. 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ää

  28. Confirmation note • Kertoo käyttäjälle onnistuneesta operaatiosta • Lyhyt kesto + pieni ääni • Wrapper-luokka CAknConfirmationNote

  29. Information note • Kertoo käyttäjälle odottamattomasta tapahtumasta • Pidempi kesto ja kovempi ääni kuin confirmation notella • Wrapper-luokka CAknInformationNote

  30. Warning note • Varoittaa käyttäjää tilanteesta, joka saattaa vaatia toimenpiteitä • Esim. akku lopussa, muisti vähissä, jne... • Wrapper-luokka CAknWarningNote

  31. Error note • Kertoo käyttäjälle vakavasta virheestä • Esim. väärä salasana, tiedostoa ei voida tuhota, muisti lopussa, jne... • Wrapper-luokka CAknErrorNote

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

  33. Queryt • Datan keräämiseen, jonkin toiminnan varmistamiseen, yms... • Local vs. global query • Confirmation query • Data query • List query

More Related