<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<title>RE: [Gvsig_desarrolladores] gvSIG Movile - carga de imagenes en hilos</title>
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
span.EstiloCorreo18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page Section1
        {size:612.0pt 792.0pt;
        margin:70.85pt 3.0cm 70.85pt 3.0cm;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=ES link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Gracias Javier,<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Si que he probado con las dos máquinas virtuales. Me imaginaba
que podía ser lo que comentas, concretamente el objeto al que se accede simultáneamente
es el gráfico del MapControl.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>En cuanto a tu opinión respecto a este cambio pues no sé qué
decir. Yo con este cambio, en el emulador en PC (y en mobile durante un periodo
corto de tiempo hasta que se cierra), veo que mejora la visualización ya que
entre la carga de una imagen y otra no se produce parpadeo y no le da al
usuario sensación de bloqueo. En mi caso tengo una capa entera cacheada (capa
WMTS definida por la OGC en el borrador) que se pinta directamente y que permite
al usuario tener localizada su posición mientras que se cargan el resto de
capas. <o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>En fin, gracias por tu respuesta y ya te comentaré si termino de
implementar este cambio. Lo mejor de este cambio es que no supone un cambio
importante en el código. De hecho solo hay comentar un método y descomentar otro.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Gracias y un saludo.</span><b><span style='font-size:11.0pt;
font-family:"Calibri","sans-serif";color:#1F497D'><o:p></o:p></span></b></p>

<p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></b></p>

<p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Ignacio Gámez Ramírez<o:p></o:p></span></b></p>

<p class=MsoNormal><b><span style='font-size:11.0pt;font-family:"Arial","sans-serif";
color:navy'>Geograma S.L.</span></b><span style='font-size:8.0pt;font-family:
"Arial","sans-serif";color:#1F497D'><o:p></o:p></span></p>

<p class=MsoNormal><b><span style='font-size:9.0pt;font-family:"Arial","sans-serif";
color:#004080'>Topografía, Cartografía y Sistemas de Información Geográfica</span></b><b><span
lang=ES-TRAD style='font-size:9.0pt;color:#004080'><o:p></o:p></span></b></p>

<p class=MsoNormal><b><span style='font-size:8.0pt;font-family:"Arial","sans-serif";
color:#004080'><a href="http://www.geograma.com/"><span style='color:blue'>www.geograma.com</span></a></span></b><span
style='font-size:8.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p></o:p></span></p>

</div>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>De:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>
gvsig_desarrolladores-bounces@listserv.gva.es
[mailto:gvsig_desarrolladores-bounces@listserv.gva.es] <b>En nombre de </b>Javier
Carrasco<br>
<b>Enviado el:</b> jueves, 23 de julio de 2009 10:51<br>
<b>Para:</b> Lista de Desarrolladores de gvSIG; Lista de Desarrolladores de
gvSIG<br>
<b>Asunto:</b> Re: [Gvsig_desarrolladores] gvSIG Movile - carga de imagenes
enhilos<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<p style='margin-bottom:12.0pt'><span style='font-size:10.0pt'>Hola Ignacio,<br>
Si se te cierra la aplicación debe estar produciéndose un error<br>
que la máquina virtual no captura. Sin haber hecho ninguna prueba<br>
me arriesgo a decir que es un problema de concurrencia. Es decir<br>
puede que desde varios hilos se esté utilizando algún objeto que<br>
no está preparado para ser compartido por varios hilos<br>
simultáneamente.<br>
<br>
¿Has probado tanto con J9 como con PhoneME?<br>
<br>
Supongo que tus PDA tampoco tendrán varios procesadores y como de<br>
cualquier forma las capas deben pintarse de abajo a arriba, te<br>
recomiendo que pruebes a lanzar esos pintados en un solo hilo (o<br>
lanzar los hilos uno detrás de otro) y si eso resuelve el problema<br>
puedes mirar qué objeto no soporta concurrencia.<br>
<br>
Respecto a la mejora que esta técnica supone yo tengo una opinión<br>
personal algo distinta. En gvSIG desktop el pintado se realiza de<br>
la forma que tú estás implementando para mobile pero yo creo que<br>
el frecuente repintado que se realiza por el recentrado del GPS<br>
y la poca potencia de las PDA permite repensar esta técnica.<br>
<br>
Desde mi punto de vista la técnica más correcta en este caso sería<br>
aprovechar la imagen anterior (la última pintada) y ajustarla para<br>
mostrarla al usuario hasta que tengamos una que la sustituya. Por<br>
ejemplo, al hacer pan, la imagen anterior puede pintarse desplazada<br>
hasta que tengamos una nueva (esto ya se hace a medias, y sirve para<br>
el caso del recentrado del GPS) y al hacer zoom la imagen anterior<br>
puede escalarse y mostrarse hasta que tengamos la nueva (esto no está<br>
implementado aún). Esto suele costar menos (en tiempo de proceso) que<br>
pintar alguna capa.<br>
<br>
La técnica de desktop en mobile puede producir un parpadeo muy grande<br>
ya que al moverse (por ejemplo con recentrado de GPS) la pantalla se<br>
queda blanca esperando la primera capa, luego sobre eso se pinta otra<br>
capa, etc. A mi modo de ver, la técnica de utilizar la imagen anterior<br>
permite mantener la referencia entre lo que estábamos viendo hace un<br>
momento y lo que se va a mostrar en el momento siguiente mientras que<br>
usando la otra puede parecer que lo que se muestra es completamente<br>
nuevo.<br>
<br>
De todas formas si terminas de implementarlo, por favor, cuéntanos qué<br>
tal funciona.<br>
<br>
Un saludo<br>
Javi<br>
<br>
<br>
<br>
-----Mensaje original-----<br>
De: gvsig_desarrolladores-bounces@listserv.gva.es en nombre de Ignacio Gámez
Ramírez<br>
Enviado el: jue 23/07/2009 9:41<br>
Para: Lista de Desarrolladores de gvSIG<br>
Asunto: [Gvsig_desarrolladores] gvSIG Movile - carga de imagenes en hilos<br>
<br>
Buenas,<br>
<br>
Estoy haciendo algunas pruebas para cambiar la forma de renderizar las imágenes
y tengo un problema con el que llevo varios días sin conseguir detectar cual es
el error.<br>
Os comento: En el MapControl se tiene el método &quot;public boolean
draw(boolean doClear)&quot; que se encarga de renderizar las distintas capas a
través de otro método de la clase MapContext. La forma de renderizar las capas
es secuencial de forma que hasta que no se completa la carga de todas las capas
no se muestra la imagen final. Yo estoy intentando que la renderización de
capas se haga de forma independiente para que a medida que se carga una capa se
muestre en el visor. Para ello he creado una clase &quot;Render&quot; que se
encarga de lanzar la renderización de cada capa en un hilo (Thread)
independiente y a medida que terminan de pintarse se le muestra al usuario (con
orden).<br>
A esta clase &quot;render&quot; le paso el gráfico del MapControl para pintar
las capas en este.<br>
Os adjunto la clase Render para que os hagáis una idea (es una clase muy
simple). Para dar transparencia a la imagen base he hecho una chapuza que es
cargar una imagen transparente al cargar la aplicación para no perder tiempo en
cargar la imagen cada vez que se utiliza (pero sin más, eso no preocupa ahora).<br>
<br>
El problema que tengo es que en PC funciona correctamente (a medida que se
pintan las imágenes se les va mostrando al usuario) pero en móvil se cierra
inesperadamente la máquina virtual y después de revisar el código (que es muy
simple) no consigo entender por qué puede ser. Me imagino que tiene que estar
relacionado con pintar en el gráfico del MapControl de forma
&quot;aleatoria&quot; o mejor dicho &quot;no de forma secuencial&quot;.<br>
<br>
Me interesa mucho resolver esto porque creo que mejora la visualización de los
mapas ya que cuando hay varias capas se evita que el usuario tenga que esperar
mucho para ver resultados.<br>
<br>
EL método de la clase MapControl sería algo así:<br>
<br>
public boolean draw(boolean doClear)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean do_something =
(project.getMapContext().getLayerCount() &gt; 0);<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (true) {&nbsp;&nbsp;&nbsp;&nbsp;
clearCanvas();}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (do_something)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setProcessing(true);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//project.getMapContext().draw(mapGraphics, canc);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; draw(mapGraphics, canc);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return do_something;<br>
}<br>
<br>
public void draw(Graphics2D g,Cancellable canc)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ViewPort viewPort = getViewPort();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (viewPort.getAdjustedExtent() ==
null) {return;}<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // IMPORTANTE: EL NUEVO RENDER<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Render render = new
Render(g,viewPort,this);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FLayer[] vls = getVisibleLayers();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; render.draw(vls, canc);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.gc();<br>
}<br>
<br>
public void setProcessing(boolean isSplashVisible, boolean notRedraw,
Graphics2D g)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
processingSplash.setVisible(isSplashVisible);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dontRedraw=notRedraw;<br>
}<br>
<br>
Siento enviaros toda esta chapa pero igual a alguien le interesa el tema ya que
creo que mejora la visualización de mapas.<br>
<br>
Un saludo.<br>
<br>
<br>
</span><o:p></o:p></p>

</div>

</body>

</html>