Symbian-ohjelmointia, osa 2

symbiatch - 31.01.2006 09.27 - mobiili ohjelmointi 

Yksi iso osa Symbiania on asynkronisuus. Kaikki mitä normaalisti olet tottunut tekemään synkronisesti sujuu paljon vaikeammin Symbianissa. Esimerkiksi jos haluat ladata JPEG-kuvan, normaalisti sinun tarvitsee vain pyytää konversiomodulia lataamaan kuva ja saat sen paluuarvona. Tämä olisi liian helppoa, joten Symbianissa asiat tehdään toisin.

Jos haluat ladata kuvan, sinun täytyy ensin luoda konversio-olio. Sen jälkeen sinun täytyy kertoa sille minkä kuvan haluat ladata. Tämä metodi palautuu heti, mutta kuvaa ei ole vielä ladattu. Se on vain mennyt jonoon ja hoidellaan joskus. Nyt sinun täytyy odottaa takaisinkutsua, jossa kerrotaan kuvan olevan auki. Sen jälkeen pyydät purkamaan kuvan, tämäkin kutsu palautuu heti, mutta kuva puretaan taustalla ja saat tästäkin takaisinkutsun.

Eli jos vain haluat ladata kuvan ja näyttää sen ruudulla, joudut odottelemaan sitä hetkeä kun Symbian päättää sen tehdä. Et voi suoraan vain jäädä odottelemaan kuvaoliota ja sen jälkeen piirtää sitä ruutuun. Se olisi liian käyttäjäystävällistä.

Sama koskee kameraa. Ensin sinun pitää varata kamera. Sen jälkeen takaisinkutsussa käynnistää kamera. Sen takaisinkutsussa voit sitten asettaa parametrit ja vaikka käynnistää esikatselun. Entä jos et haluakaan heti esikatselua, mutta vähän myöhemmin? Sinun pitää rakentaa monimutkainen seurantajärjestelmä, josta tiedät onko kamera jo valmis vai ei.

Oletan että tällaisilla järjettömän runsailla asynkronisuuksilla on haettu sitä, että käyttöliittymä pysyy koko ajan käytettävänä eikä sovellus näennäisesti jumitu, jos vaikka kuvan muunnoksessa meneekin sekunti tai pari. Olisi kuitenkin "ihan kiva", jos voisi itse valita käytetäänkö asynkronisuutta vai tehdäänkö asia synkronisesti. Varsinkin kun nykylaitteissa nämä kutsut eivät kestä kovinkaan kauaa.

Lue kommentit (5) | Kommentoi

Symbian-ohjelmointi, osa 1

symbiatch - 25.01.2006 14.57 - mobiili ohjelmointi 

Ajattelin kirjoitella hieman asiaa Symbian-ohjelmoinnista näin suomeksi, jos siitä olisi jollekin hyötyäkin. Kaikenlaista on tullut vastaan ja voi sanoa ettei vieläkään paljoa tuosta hirvityksestä tiedä. Mutta oppia ikä kaikki.

Virheilmoitukset

"Emulaattori" on siitä surkea laitos, ettei se anna kovinkaan hyviä virheilmoituksia kehittäjälle, jos antaa mitään. Siinä mielessä toimii täysin samoin kuin oikeakin käyttis. Hieman parempaa tietoa virheistä saa joka tapauksessa luomalla emulaattorin asennushakemiston alla olevaan Epoc32\wins\c\System\Bootdata-hakemistoon tiedoston errrd. Huomaa kolme R-kirjainta ja ei tiedostopäätettä. Tämän jälkeen emulaattori kertoo paniikin syyn ja myös esimerkiksi muistivuotopaniikeissa osoitteen, joka jäi vapauttamatta. Tämä toimii myös kännyköissä (siellä hakemisto tietysti C:\System\Bootdata, vaatii uudelleenkäynnistyksen).

Debug-moodi

Aja aina kehityskoodia debug-emulaattorilla! Debug-moodissa emulaattori panikoi ohjelmaa suljettaessa jos esimerkiksi muistia on jäänyt vapauttamatta tai et ole sulkenut jotain resurssioliota (R-alkuiset luokat).

Muistivuodot

Muistivuotojen löytämiseen kannattaa käyttää HookLogger-työkalua. Asenna työkalu ja lue mukana tullut esimerkki. Vakiona mainittu hookeuser-komento ei yleensä toimi (luonnollisesti, onhan kyse Symbianista) vaan skriptiä pitää muokata. Skripti löytyy vakiona hakemistosta Program Files\Common Files\Symbian\Tools. Avaa hookeuser.pl, korjaa seuraavat rivit:

74: my $cmd = "copy \"$hooks_src\"";
77: $cmd = "\"$Bin/AttachDll\" $euser $hooks $hooked_euser";

Virhe johtuu siitä, ettei oteta huomioon vakiohakemistossa olevan välilyöntejä, joten komennot sekoavat.

Tämän jälkeen mene SDK:n juureen ja aja komento hookeuser wins. Tämän jälkeen HookLogger on käytössä.

Käynnistä ensin HookLogger ja sen jälkeen debug-emulaattori. Saatat saada virheen, jossa kerrotaan UID-filtteröinnin olevan toimimaton. Tämä ei ole vaarallista, mutta aiheuttaa sen, ettei HookLogger osaa erotella sinun ohjelmasi ja muiden ohjelmien muistinvarauksia.

Käynnistä ohjelmasi, tee mitä ohjelmalla tekisit ja sulje se. Tämän jälkeen jos saat paniikin muistiongelmasta, jätä se emulaattorin ruutuun. Avaa HookLoggerista Heap-välilehti, paina List all allocs ja odota. Listaus kestää jonkin aikaa. Tämän jälkeen järjestä lista Ptr-kohdan mukaan ja etsi emulaattorin antama osoite (listan loppupäässä). Valitse rivi jolla osoite on ja paina Alloc details. Saat kutsupinon, josta näet missä kohtaa muisti varattiin. Korjaa koodisi siten, että muisti vapautetaan.

Paniikkikoodeja

USER 45
Tämä tarkoittaa yleensä sitä, että olet vapauttanut muistia, muttet ole asettanut osoitinta NULLiksi ja yrität vapauttaa muistia uudelleen. Tämä osoite ei kuitenkaan enää ole varatun muistin alkukohta, joten saat tämän virheen.
CONE 36
Tämä koodi tarkoittaa sitä, että sinulla on joku resurssiolio (R-alkuiset luokat) avattuna etkä ole sulkenut sitä. Käytätkö esimerkiksi RFs-luokkaa, muttet sulje?

Emulaattorin näppäinkomennot

Emulaattorissa on muunmuassa seuraavat näppäinkomennot käytettävissä:

Ctrl-Shift-Alt-T
Avaa taskinhallinnan josta voi vaihtaa sovellusta
Ctrl-Shift-Alt-A
Kertoo paljonko muistia senhetkinen sovellus vie
Ctrl-Shift-Alt-K
Tappaa senhetkisen sovelluksen

Lue kommentit (2) | Kommentoi

 
Jutut.fi  |  Omat jutut  |  Muiden jutut  |  Kategoriat  |   kirjaudu