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:
wp_xxyyzz
2023-04-20 11:09:34 +00:00
parent 649286bb6b
commit 2b8ffd7796

View File

@ -201,14 +201,22 @@ begin
Finalize(FMinZoom);
Finalize(FMaxZoom);
EnterCriticalSection(FTileHandling);
for i := high(FTiles) downto 1 do
try
freeandnil(FTiles[i]);
except
FTiles[i]:=nil;
end;
LeaveCriticalsection(FTileHandling);
DoneCriticalsection(FTileHandling);
try
for i := high(FTiles) downto 0 do
try
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;
except
FTiles[i] := nil;
end;
finally
LeaveCriticalSection(FTileHandling);
end;
DoneCriticalSection(FTileHandling);
inherited;
end;
@ -217,28 +225,62 @@ var
lNewID: Integer;
begin
EnterCriticalSection(FTileHandling);
lNewID :=high(FTiles)+1;
setlength(FTiles,lNewID+1);
FTiles[lNewID]:=aTile;
LeaveCriticalsection(FTileHandling);
result := lNewID;
try
lNewID :=high(FTiles)+1;
setlength(FTiles,lNewID+1);
FTiles[lNewID]:=aTile;
result := lNewID;
finally
LeaveCriticalsection(FTileHandling);
end;
end;
procedure TMapProvider.RemoveTile(aTile: TBaseTile);
var
lID, lMaxTile: Integer;
lID, lMaxTile, lTileIdx, i: Integer;
begin
if (atile.ID <= high(FTiles)) and (atile.ID>0) and (FTiles[aTile.ID]=aTile) then
EnterCriticalSection(FTileHandling);
{
try
if (aTile.ID <= high(FTiles)) and (aTile.ID>0) and (FTiles[aTile.ID]=aTile) then
begin
EnterCriticalSection(FTileHandling);
lID := aTile.ID;
lMaxTile :=High(FTiles);
aTile.FID := -1;
FTiles[lID] := FTiles[lMaxTile];
FTiles[lID].FID := lID;
setlength(FTiles,lMaxTile);
LeaveCriticalsection(FTileHandling);
SetLength(FTiles,lMaxTile);
end;
finally
LeaveCriticalsection(FTileHandling);
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;
procedure TMapProvider.AddURL(Url: String; ProjectionType: TProjectionType;