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(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;