哪位在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.
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.
如果要实现每秒60条,你就不能用TIMER,必须THREAD才可以;
如果用TIMER的话,最小的 Interval:=10是没有意思的,因为操作系统最小的值也是30;所以一秒也就是30多条;
如果要实现每秒60条,你就不能用TIMER,必须THREAD才可以;
没有关系,其实你可以把这个顶楼的内容拷贝下去,运行一下变知