哪位在delphi中用MapX4.5开发过软件,帮我解决一个速度问题 应用要求每秒钟能够插入显示最少60个点,但是我写的程序只能每秒钟插入不到20个点。(我的程序必须在图层中的数据库插入四个字段,在每次插入点的是否还必须插入数据)。示例程序如下:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtrls, MapXLib_TLB, ExtCtrls, StdCtrls;type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Map1: TMap;
    btnStart: TButton;
    btnStop: TButton;
    btnZoomIn: TButton;
    btnZoomOut: TButton;
    btnMove: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btnStartClick(Sender: TObject);
    procedure btnStopClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnZoomInClick(Sender: TObject);
    procedure btnZoomOutClick(Sender: TObject);
    procedure btnMoveClick(Sender: TObject);
  private
    FMapFeature : Feature;
    FStartTime:TDateTime;
    FMapFont: TFont;                            //图层上的字体
    FLon,FLat:Double;
    FX,FY:Double;
    FTotalPointer:Integer;
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
var
  LayerFields: Fields;   //图层数据列
  ALayerInfo: LayerInfo; //图层信息
  LayerTemp: Layer;      //图层
  MapPoint: Point;       //地图上的点
begin
  FMapFont := TFont.Create;  LayerFields := CoFields.Create;
  with LayerFields do
  begin
    AddStringField('AAA',2);
    AddStringField('BBB',4);
    AddStringField('CCC',5);
    AddStringField('DDD',5);
  end;
  //定义临时图层信息
  ALayerInfo := CoLayerInfo.Create;
  ALayerInfo.Type_:= miLayerInfoTypeTemp;
  ALayerInfo.AddParameter('Fields',LayerFields); //加入表格
  ALayerInfo.AddParameter('Name','LayerTemp');      //加入图层名称  LayerTemp := map1.Layers.Add(ALayerInfo,1);
  map1.Datasets.Add(miDataSetLayer,LayerTemp,'LayerTemp',EmptyParam,EmptyParam,
                 EmptyParam,EmptyParam,EmptyParam);
  LayerTemp.Editable := false;  //创建图层显示元素
  MapPoint := CoPoint.Create;
  FMapFeature := map1.FeatureFactory.CreateSymbol(MapPoint,map1.DefaultStyle);
  FMapFeature.Point.Set_(-360,-180);  Map1.Refresh;
end;procedure TForm1.btnStartClick(Sender: TObject);
begin
  FLon:=Map1.CenterX;
  FLat:=Map1.CenterY;
  FX:=0.00001;
  FY:=0.00002;
  Timer1.Interval:=10;
  FStartTime:=Now;
  Timer1.Enabled:=true;
  FTotalPointer:=0;
end;procedure TForm1.btnStopClick(Sender: TObject);
begin
  Timer1.Enabled:=false;
end;procedure TForm1.Timer1Timer(Sender: TObject);
var
  fFeature:Feature;
  iCount,iLayer,iTotal,iID:Integer;
  sTemp:String;
  MapRowValues: RowValues;        //图层上点所对应的数据
  dSec:TDateTime;
  bEnabled:Boolean;
begin
  bEnabled:=Timer1.Enabled;
  Timer1.Enabled:=false;
  try
    fFeature:=FMapFeature;
    fFeature.Type_:=miFeatureTypeSymbol;
    fFeature.Style.SymbolFontOpaque:=false;
    fFeature.KeyValue := '1';       //标记为元素
    fFeature.Style.SymbolType := miSymbolTypeTrueTypeFont;
    fFeature.Style.SymbolCharacter := ord(')');
    fFeature.Style.SymbolFontColor:=clRed;    OleFontToFont(fFeature.Style.SymbolFont,FMapFont);
    FMapFont.Name :=  'MapInfo Cartographic';
    FMapFont.Size :=  10;
    FLon:=FLon+FX;
    FLat:=FLat+FY;
    fFeature.Point.Set_(FLon,FLat);    iLayer:=-1;
    iTotal:=map1.Layers.Count;
    for iCount:=1 to iTotal do
    begin
      sTemp:=map1.Layers.Item(iCount).Name;
      if sTemp<>'LayerTemp' then Continue;
      iLayer:=iCount;
      Break;
    end;
    if iLayer<0 then exit;    fFeature := map1.Layers.Item(iLayer).AddFeature(fFeature,EmptyParam);
    iID:=fFeature.FeatureID;    MapRowValues := map1.Datasets.Item('LayerTemp').RowValues[iID];
    MapRowValues.Item('AAA').Value:='A';
    MapRowValues.Item('BBB').Value:='B';
    MapRowValues.Item('CCC').Value:='C';
    MapRowValues.Item('DDD').Value:='D';    fFeature.Update(EmptyParam,MapRowValues);    Inc(FTotalPointer);    Caption:='总点数:'+IntToStr(FTotalPointer);
    dSec:=(Now-FStartTime)*24*3600;
    if dSec<>0 then Caption:=Caption+'===每秒平均'+FloatToStr(FTotalPointer/dSec);
  Finally
    Timer1.Enabled:=bEnabled;
  end;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
  FMapFont.free;
end;procedure TForm1.btnZoomInClick(Sender: TObject);
begin
  map1.CurrentTool:=miZoomInTool;
end;procedure TForm1.btnZoomOutClick(Sender: TObject);
begin
  map1.CurrentTool:=miZoomOutTool;
end;procedure TForm1.btnMoveClick(Sender: TObject);
begin
  map1.CurrentTool:=miPanTool;
end;end.

解决方案 »

  1.   

    如果用TIMER的话,最小的Interval:=10是没有意思的,因为操作系统最小的值也是30;所以一秒也就是30多条;
    如果要实现每秒60条,你就不能用TIMER,必须THREAD才可以;
    如果用TIMER的话,最小的 Interval:=10是没有意思的,因为操作系统最小的值也是30;所以一秒也就是30多条;
    如果要实现每秒60条,你就不能用TIMER,必须THREAD才可以;
      

  2.   

    我用Timer是因为这是一个示例性的程序,你说的对,timer的精度不够,我写示例性程序的是否考虑的不过充分,不过这并不是问题的症结。我把ontimer的内容放到一个for icount:=0 to 10的循环中每秒钟也只能插入不到20个点
      

  3.   

    to Outer2000:
    没有关系,其实你可以把这个顶楼的内容拷贝下去,运行一下变知