Ver Mensaje Individual
  #3 (permalink)  
Antiguo 13/03/2009, 07:27
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años, 3 meses
Puntos: 2658
Respuesta: Cómo lograr que no se interrumpa un script de larga duración?

Bueno, el caos se puede ejemplificar con este código:
Código javascript:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4.     <head>
  5.         <title>Ejemplo de geocodificacion</title>
  6.         <meta http-equiv="content-type" content="text/html; charset=utf-8">
  7.         <script src="http://maps.google.com/maps?file=api&amp;v=2.x&amp;key=MiGooglekey"
  8.             type="text/javascript"></script>
  9.         <script type="text/javascript">
  10.     //<![CDATA[
  11.  
  12.     var map;
  13.     var geocoder = null;
  14.     var addressMarker;
  15.     var regs = [
  16.     1,
  17.     2,
  18.     3,
  19.     4,
  20.     5,
  21.     6,
  22.     7,
  23.     8,
  24.     9,
  25.     10,
  26.     11,
  27.     12,
  28.     13,
  29.     14,
  30.     15,
  31.     16,
  32.     17,
  33.     18,
  34.     19,
  35.     20,
  36.     // Aquí van otros 350 ID
  37.     ];
  38.     var lats = [
  39.     18.67708969116211,
  40.     18.51841926574707,
  41.     21.15048980712890,
  42.     21.15048980712890,
  43.     21.15048980712890,
  44.     21.16732025146484,
  45.     18.67708969116211,
  46.     18.51841926574707,
  47.     21.15048980712890,
  48.     21.15048980712890,
  49.     21.15048980712890,
  50.     21.16732025146484,
  51.     18.67708969116211,
  52.     18.51841926574707,
  53.     21.15048980712890,
  54.     21.15048980712890,
  55.     21.15048980712890,
  56.     21.16732025146484,
  57.     18.67708969116211,
  58.     18.51841926574707,
  59.     // Aqui van otras 350 latitudes más.
  60.     ];
  61.     var lngs = [
  62.     -88.39904785156250,
  63.     -88.32911682128906,
  64.     -86.86348724365233,
  65.     -86.86348724365233,
  66.     -86.86348724365233,
  67.     -86.83305358886720,
  68.     -88.39904785156250,
  69.     -88.32911682128906,
  70.     -86.86348724365233,
  71.     -86.86348724365233,
  72.     -86.86348724365233,
  73.     -86.83305358886720,
  74.     -88.39904785156250,
  75.     -88.32911682128906,
  76.     -86.86348724365233,
  77.     -86.86348724365233,
  78.     -86.86348724365233,
  79.     -86.83305358886720,
  80.     -88.39904785156250,
  81.     -88.32911682128906,
  82.     -86.86348724365233,
  83.     // Aqui van otras 350 longitudes más. 
  84.     ];
  85.     var numGeocoded = 0;
  86.     var punto;
  87.     var marker = null;
  88.    
  89.     function geocodeAll() {
  90.       if (numGeocoded < lats.length) {
  91.         punto = new GPoint(lats[numGeocoded],lngs[numGeocoded]);
  92.       geocoder.getLocations(punto, addressResolved);
  93.       }
  94.       else{document.getElementById("terminado").value ="1";}
  95.     }
  96.  
  97.    function addressResolved(response) {
  98.      var delay = 0;
  99.      if (response.Status.code == 620) {
  100.        // Demasiado rápido. Intenta de nuevo pero con una pausa
  101.        delay = 500;
  102.      } else {
  103.        if (response.Status.code == 200) {
  104.             // Obtenida: Se utiliza la direccion
  105.             var dir = response.Placemark[0].address;
  106.             if (dir){
  107.             document.getElementById("geocode").value +=  regs[numGeocoded] + "\t" + dir + "\n";}
  108.             else{document.getElementById("geocode").value += regs[numGeocoded] + "\t" + "Posicion no encontrada" + "\n";}
  109.             numGeocoded += 1;
  110.           }
  111.        
  112.        // Mover puntero a las siguientes coordenadas; si es una posicion falsa, lo saltea.
  113.      }
  114.      window.setTimeout(geocodeAll, delay);
  115.    }
  116.  
  117.     function load() {
  118.       if (GBrowserIsCompatible()) {
  119.         map = new GMap2(document.getElementById("map"));
  120.         map.setCenter(new GLatLng(-34.608175166943,-58.368855956794), 16);
  121.         map.setMapType(G_NORMAL_MAP);
  122.         geocoder = new GClientGeocoder();
  123.         geocoder.setCache(null);
  124.         document.getElementById("geocode").value ="";
  125.         document.getElementById("terminado").value ="0";
  126.        window.setTimeout(geocodeAll, 50);
  127.       }
  128.     }
  129.  
  130.     function addtag(point, dir)
  131.         {
  132.         marker = new GMarker(point,{draggable:false, bouncy:false,clickable:true});
  133.         GEvent.addListener(marker, "click", function(){
  134.             marker.bindInfoWindow(dir);});
  135.         return marker;
  136.         }
  137.  
  138.     //]]>
  139.         </script>
  140.     </head>
  141.     <body onload="load()" onunload="GUnload()">
  142.         <div id="map" style="WIDTH: 150px; HEIGHT: 100px"></div>
  143.         <TEXTAREA id="geocode" style="WIDTH: 152px; HEIGHT: 118px" name="geocod" rows="7" cols="16">
  144.         </TEXTAREA>
  145.         <BR>
  146.         <INPUT id="terminado" type="hidden" name="termino">
  147.     </body>
  148. </html>
En este ejemplo, en un momento dado (aproximadamente unos 10 segundos después) aparece la dichosa ventanita. Después de continuar, vuelve a aparecer en lapsos de tiempo similares, y eventualmente el control desde el codigo VB.net falla porque algún elemento no puede leer una instancia de un objeto durante un ciclo de detenido.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)