viernes, 18 de septiembre de 2009

Brew: Manejo de Eventos vs Loop

Comenzando a desarrollar en brew, me encontre con el siguiente problema: Todo se maneja por eventos. Al contrario de J2ME, donde generabamos la tipica estructura de loop infinito con un sleep en el medio, la unica opcion en brew es setear un timer.

Si el SO del telefono detecta (o mejor dicho sospecha) que la aplicacion deja de responder, para la ejecucion y fuerza un reinicio. Debido a esto es imposible utilizar while (true) o algo por el estilo...

Para setear un timer, utilizamos la funcion:

int ISHELL_SetTimer
(
IShell * pIShell,
int32 dwMSecs,
PFNNOTIFY pfn,
void * pUser
);


Los parametros serian: un puntero a la interface iShell, cantidad de milisegundos del timer, un puntero a la funcion callback que sera llamada por el timer, y por ultimo un void pointer que sera pasado como parametro cuando se llame al callback.

Los valores de retorno son AEE_SUCCESS, AEE_EBADPARM, AEE_ENOMEMORY.

La funcion que definamos como callback, debe tener, obviamente, como unico parametro un void * y no retornar ningun valor.

Una cosa mas a tener en cuenta, es que la llamada al callback es por unica vez, asi que si necesitamos que se ejecute constantemente, debemos re setear el timer adentro del mismo callback.


La mayoria de los telefonos despues de permanecer cierto tiempo sin que se presione alguna tecla, entran en un estado de IDLE o SLEEP. Si necesitamos evitar esto necesitamos handlear el evento de la siguiente manera:



case EVT_APP_NO_SLEEP:
//Don't want to sleep
return TRUE;

No hay comentarios: