[Gvsig_desarrolladores] ¿Pintado por threads?

jaume domínguez faus jaume.dominguez en iver.es
Lun Oct 1 15:11:28 CEST 2007


El thread de pintado va recibiendo comandos de pintado e inmediatamente 
se pone a pintar en segundo plano sobre una imagen en memoria. 
Frecuentemente, y para observar el progreso (porque puede llegar a 
tardar varios segundos en terminarlo) el mapcontext renderiza esa imagen 
y se muestra en pantalla. Esto es cada 400 milisegundos (y a partir de 
v1.2 será configurable de manera que se puede ver el progreso en tiempo 
real) y en el momento en que el thread ha terminado de pintar.

por otra parte, si observas el interfaz de las capas (FLayer's) verás 
que el método draw (que dibuja cada capa) tiene un argumento Cancellable 
que tiene un método isCanceled(). Cuando se ha cancelado el pintado (sea 
por un zoom, un pan o cualquier otro evento que comporte que lo que hay 
actualmente ya no es válido y debe de recalcularse) entonces 
isCanceled() devuelve true. En cualquier otro caso devuelve false.

La manera de agilizar la cancelación es dentro de cada una de las 
iteraciones que se hace en el método draw y posteriores llamadas 
internas comprobar que isCanceled() es false. Si lo es, pues continuamos 
renderizando, si no lo es, se aborta todo el proceso y entonces se sale 
del método del draw. Si se cancela el pintado de todas las capas de 
manera encadenada la petición de draw del MapContext se termina.  
Entonces se atiende a la siguiente (la que ha provocado que el 
mapcontext se invalide y que cancel.isCanceled() devuelva true).

Que el cancelado sea inmediato o no depende del tipo de capas y de la 
implementación del método draw de ellas. La mayor parte de las capas 
tienen en cuenta el Cancelable. Pero hay algunas que no lo pueden 
comprobar e inevitablemente ejecutan su método draw íntegro aunque el 
resultado no se llegue a mostrar en pantalla.

Espero aclarar.
Salut!


Juan Lopez wrote:
> Supongo que te referias al Worker Thread pattern. No he conseguido 
> buena documentacion sobre él.
> Si pudierais facilitarme documentacion?.
>
> De todas formas supongo que la forma de pintar de gvsig se basa en un 
> unico thread, que cuando termina de "pintar" muestra el resultado 
> completo al usuario (entre otras cosas para q el usuario no vea el 
> proceso de pintar sino el resultado final de un golpe). Al "pintarse" 
> mediante un thread el usuario puede interactuar con la aplicacion 
> mientras esta pinta?
> ¿Y que pasa si mientras está pintando, el usuario manda realizar otro 
> pintado (por ejemplo haciendo un zoom)? ¿como reacciona?
> ¿Cancela el primer pintado y realiza el segundo?¿o por el contrario, 
> el segundo pintado se pone a la cola del unico thread y cuando 
> finaliza el primero acomete el segundo?
>
> Gracias de antemano
> ------------------------------------------------------------------------
>
> _______________________________________________
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores en runas.cap.gva.es
> http://runas.cap.gva.es/mailman/listinfo/gvsig_desarrolladores
>   


-- 
Jaume Dominguez Faus


Àrea de Software Lliure
Equip gvSIG
Iver TI
C. Salamanca, 52
46005 València
Telf: 902 25 25 40 Fax: 96 316 27 16
(Spain)
 


Este mensaje y sus archivos son confidenciales. No está permitida su reproducción o distribución sin la autorización expresa de "IVER Tecnologías de la Información". Si usted no es el destinatario previsto, queda desautorizado cualquier uso, acceso o copia de este mensaje. Si ha recibido este mensaje por error, por favor bórrelo e infórmenos por esta misma vía.



Más información sobre la lista de distribución gvSIG_desarrolladores