5

实际上,我通过在我的 TWebBrowser 中的 index.html(使用谷歌地图显示和处理点)中显示它每 2 秒显示许多实时 GPS 点(20 个),这大大减慢了我的应用程序。

当我在同一个应用程序下获得另一个模块允许我在我的数据库中输入数据时,它通常会冻结我的应用程序。

我知道线程是为此而设计的,但我不确定它是否能解决我的问题。有任何想法吗 ???

谢谢格韦纳尔

PS:我从外部文件加载我的javascript代码(而不是我的delphi应用程序中加载的源代码)这一事实是否会减慢我的应用程序?

4

2 回答 2

3

如果您从外部文件中获取您的 javascript,它将被缓存,所以不,这可能不会减慢您的速度,除非是第一次。

缓慢的可能原因,以及加快速度的建议:

  • TWebBrowser 封装了Internet Explorer,它在处理此类任务时并不以其原始速度而闻名;如果您想要快速处理 JavaScript,请考虑 DelphiChromiumEmbedded

  • 如果你每两秒画一个标记,你必须为一小时的车程画 1800 个标记。如果您想显示多次旅行,那么绘制所有具有 alpha 透明度的图标将是一项繁重的任务。

我通常每 2 分钟画一个标记(带行车方向的箭头),或者如果自上一个标记以来已经行驶了200多米。这样一来,当汽车静止不动时,您就不必绘制一大堆标记。

您可以使用道格拉斯-普克算法来简化这条线。作为参数,您将给出该行中允许的最大误差,并且它将在不超过该误差的情况下删除尽可能多的点。所以,当你有一条直线时,它会删除边缘之间的所有点。

此外,您可以考虑在某些缩放级别上聚类点。如果您改用 OpenLayers,它会更容易,但在Google Maps Util Library的帮助下,您可以使用 Google Maps(示例)做同样的事情。如果缩小,在 10x10 像素的区域上绘制 2000 个重叠的图标有点没用。

如果你给我看你的代码,我可以给你一些关于如何加快速度的更直接的建议。

于 2011-09-05T23:27:38.620 回答
1

Here is my Delphi code :

  i := 0;
  With DMMain.MDMain do
  begin
    QLastPositionGPS.Close ;
    QLastPositionGPS.Open ;
    QLastPositionGPS.First ;
    for i:=0 to QLastPositionGPS.RecordCount-1 do
    begin
      GPSLatitude     := StringReplace(QLastPositionGPS.FieldByName('latitude').AsString, ',', '.', [rfreplaceall]) ;
      GPSLongitude    := StringReplace(QLastPositionGPS.FieldByName('longitude').AsString, ',', '.', [rfreplaceall]) ;
      HeureDernierGPS := QLastPositionGPS.FieldByName('maj').AsString ;

      MDMain.QGPSactifs.Close ;
      MDMain.QGPSactifs.ParamByName('id_artisan').AsInteger := MDMain.QLastPositionGPS.FieldByName('id_artisan').AsInteger ;
      MDMain.QGPSactifs.Open ;
      if MDMain.QGPSactifs.FieldByName('etat').AsBoolean = True then
      begin         CdrCarto.Chromium1.Browser.MainFrame.ExecuteJavaScript('AjouterMarqueurCirculant('+ GPSLatitude + ', ' + GPSLongitude + ', ' + MDMain.QLastPositionGPS.FieldByName('id_artisan').AsString + ')', 'about:blank', 0) ;
      end else if OptionDisplayGPSActif then
        if (MDMain.QGPSactifs.FieldByName('etat').AsBoolean = False) and (MDMain.QGPSactifs.FieldByName('etat_serveur').AsBoolean = True) then
        begin
         CdrCarto.Chromium1.Browser.MainFrame.ExecuteJavaScript('AjouterMarqueurGPS('+ GPSLatitude + ', ' + GPSLongitude + ', ' + MDMain.QLastPositionGPS.FieldByName('id_artisan').AsString + ')', 'about:blank', 0);

        end;
      QLastPositionGPS.Next ;
      MDMain.QGPSactifs.Close ;
    end;
    QLastPositionGPS.Close ;
  end;
end;

and my Javascript code :

 function AjouterMarqueurCirculant(Lat, Long, notaxi) {
    var marker = new MarkerWithLabel({
      position: new google.maps.LatLng(Lat, Long),
       draggable: true,
       map: map,
       labelContent: "Taxi "+notaxi,
       labelAnchor: new google.maps.Point(22, 0),
       labelClass: "labelsactif",                      // the CSS class for the label
       labelStyle: {opacity: 0.75},
       labelVisible: true,
      icon:"icones/taxi_circulant_ok.png"
     });

     var iw = new google.maps.InfoWindow({
       content: "Nom Prenom"
     });
     google.maps.event.addListener(marker, "click", function (e) { iw.open(map, marker); });

    markersCirculant.push(marker);
    bounds.extend(new google.maps.LatLng(Lat, Long));
  }
于 2011-09-06T08:09:51.347 回答