You've already forked lazarus-ccr
LazMapViewer: Attempting to fix occasional crash at destruction. Patch by Ekkehard Domning
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8794 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -201,14 +201,22 @@ begin
|
|||||||
Finalize(FMinZoom);
|
Finalize(FMinZoom);
|
||||||
Finalize(FMaxZoom);
|
Finalize(FMaxZoom);
|
||||||
EnterCriticalSection(FTileHandling);
|
EnterCriticalSection(FTileHandling);
|
||||||
for i := high(FTiles) downto 1 do
|
|
||||||
try
|
try
|
||||||
freeandnil(FTiles[i]);
|
for i := high(FTiles) downto 0 do
|
||||||
except
|
try
|
||||||
FTiles[i]:=nil;
|
if Assigned(FTiles[i]) then
|
||||||
|
begin
|
||||||
|
FTiles[i].FMapProvider := nil; // Avoid removing from the FTiles array since this might change the IDs
|
||||||
|
FTiles[i].Free;
|
||||||
|
FTiles[i] := nil;
|
||||||
end;
|
end;
|
||||||
LeaveCriticalsection(FTileHandling);
|
except
|
||||||
DoneCriticalsection(FTileHandling);
|
FTiles[i] := nil;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
LeaveCriticalSection(FTileHandling);
|
||||||
|
end;
|
||||||
|
DoneCriticalSection(FTileHandling);
|
||||||
inherited;
|
inherited;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -217,28 +225,62 @@ var
|
|||||||
lNewID: Integer;
|
lNewID: Integer;
|
||||||
begin
|
begin
|
||||||
EnterCriticalSection(FTileHandling);
|
EnterCriticalSection(FTileHandling);
|
||||||
|
try
|
||||||
lNewID :=high(FTiles)+1;
|
lNewID :=high(FTiles)+1;
|
||||||
setlength(FTiles,lNewID+1);
|
setlength(FTiles,lNewID+1);
|
||||||
FTiles[lNewID]:=aTile;
|
FTiles[lNewID]:=aTile;
|
||||||
LeaveCriticalsection(FTileHandling);
|
|
||||||
result := lNewID;
|
result := lNewID;
|
||||||
|
finally
|
||||||
|
LeaveCriticalsection(FTileHandling);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TMapProvider.RemoveTile(aTile: TBaseTile);
|
procedure TMapProvider.RemoveTile(aTile: TBaseTile);
|
||||||
var
|
var
|
||||||
lID, lMaxTile: Integer;
|
lID, lMaxTile, lTileIdx, i: Integer;
|
||||||
begin
|
begin
|
||||||
if (atile.ID <= high(FTiles)) and (atile.ID>0) and (FTiles[aTile.ID]=aTile) then
|
|
||||||
begin
|
|
||||||
EnterCriticalSection(FTileHandling);
|
EnterCriticalSection(FTileHandling);
|
||||||
|
{
|
||||||
|
try
|
||||||
|
if (aTile.ID <= high(FTiles)) and (aTile.ID>0) and (FTiles[aTile.ID]=aTile) then
|
||||||
|
begin
|
||||||
lID := aTile.ID;
|
lID := aTile.ID;
|
||||||
lMaxTile :=High(FTiles);
|
lMaxTile :=High(FTiles);
|
||||||
aTile.FID := -1;
|
aTile.FID := -1;
|
||||||
FTiles[lID] := FTiles[lMaxTile];
|
FTiles[lID] := FTiles[lMaxTile];
|
||||||
FTiles[lID].FID := lID;
|
FTiles[lID].FID := lID;
|
||||||
setlength(FTiles,lMaxTile);
|
SetLength(FTiles,lMaxTile);
|
||||||
|
end;
|
||||||
|
finally
|
||||||
LeaveCriticalsection(FTileHandling);
|
LeaveCriticalsection(FTileHandling);
|
||||||
end;
|
end;
|
||||||
|
}
|
||||||
|
try
|
||||||
|
lTileIdx := -1;
|
||||||
|
for i := 0 to High(FTiles) do
|
||||||
|
begin
|
||||||
|
if FTiles[i] = aTile then
|
||||||
|
begin
|
||||||
|
lTileIdx := i;
|
||||||
|
Break;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
if lTileIdx >= 0 then
|
||||||
|
begin
|
||||||
|
lMaxTile := High(FTiles);
|
||||||
|
aTile.FID := -1;
|
||||||
|
FTiles[lTileIdx] := FTiles[lMaxTile];
|
||||||
|
FTiles[lTileIdx].FID := lTileIdx;
|
||||||
|
SetLength(FTiles, lMaxTile);
|
||||||
|
end;
|
||||||
|
for i := 0 to High(FTiles) do
|
||||||
|
begin
|
||||||
|
if FTiles[i].FID <> i then
|
||||||
|
FTiles[i].FID := i;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
LeaveCriticalSection(FTileHandling);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TMapProvider.AddURL(Url: String; ProjectionType: TProjectionType;
|
procedure TMapProvider.AddURL(Url: String; ProjectionType: TProjectionType;
|
||||||
|
Reference in New Issue
Block a user