/// <summary> /// updates map bounds /// </summary> void UpdateBounds() { if (!IsStarted || Provider.Equals(EmptyProvider.Instance)) { return; } updatingBounds = true; tileDrawingListLock.AcquireWriterLock(); try { #region -- find tiles around -- tileDrawingList.Clear(); for (long i = (int)Math.Floor(-sizeOfMapArea.Width * scaleX), countI = (int)Math.Ceiling(sizeOfMapArea.Width * scaleX); i <= countI; i++) { for (long j = (int)Math.Floor(-sizeOfMapArea.Height * scaleY), countJ = (int)Math.Ceiling(sizeOfMapArea.Height * scaleY); j <= countJ; j++) { GPoint p = centerTileXYLocation; p.X += i; p.Y += j; #if ContinuesMap // ---------------------------- if (p.X < minOfTiles.Width) { p.X += (maxOfTiles.Width + 1); } if (p.X > maxOfTiles.Width) { p.X -= (maxOfTiles.Width + 1); } // ---------------------------- #endif if (p.X >= minOfTiles.Width && p.Y >= minOfTiles.Height && p.X <= maxOfTiles.Width && p.Y <= maxOfTiles.Height) { DrawTile dt = new DrawTile() { PosXY = p, PosPixel = new GPoint(p.X * tileRect.Width, p.Y * tileRect.Height), DistanceSqr = (centerTileXYLocation.X - p.X) * (centerTileXYLocation.X - p.X) + (centerTileXYLocation.Y - p.Y) * (centerTileXYLocation.Y - p.Y) }; if (!tileDrawingList.Contains(dt)) { tileDrawingList.Add(dt); } } } } if (GMaps.Instance.ShuffleTilesOnLoad) { Stuff.Shuffle <DrawTile>(tileDrawingList); } else { tileDrawingList.Sort(); } #endregion } finally { tileDrawingListLock.ReleaseWriterLock(); } #if NET40 Interlocked.Exchange(ref loadWaitCount, 0); #else Monitor.Enter(tileLoadQueue); try { #endif tileDrawingListLock.AcquireReaderLock(); try { foreach (DrawTile p in tileDrawingList) { LoadTask task = new LoadTask(p.PosXY, Zoom, this); #if NET40 AddLoadTask(task); #else { if (!tileLoadQueue.Contains(task)) { tileLoadQueue.Push(task); } } #endif } } finally { tileDrawingListLock.ReleaseReaderLock(); } #if !NET40 #region -- starts loader threads if needed -- lock (GThreadPool) { while (GThreadPool.Count < GThreadPoolSize) { Thread t = new Thread(new ThreadStart(tileLoadThread)); { t.Name = "TileLoader: " + GThreadPool.Count; t.IsBackground = true; t.Priority = ThreadPriority.BelowNormal; } GThreadPool.Add(t); Debug.WriteLine("add " + t.Name + " to GThreadPool"); t.Start(); } } #endregion #endif { LastTileLoadStart = DateTime.Now; Debug.WriteLine("OnTileLoadStart - at zoom " + Zoom + ", time: " + LastTileLoadStart.TimeOfDay); } #if !NET40 loadWaitCount = 0; Monitor.PulseAll(tileLoadQueue); } finally { Monitor.Exit(tileLoadQueue); } #endif updatingBounds = false; OnTileLoadStart?.Invoke(); }
public void UpdateBounds()//////////////////////////// { if (!IsStarted || Provider.Equals(EmptyProvider.Instance)) { return; } updatingBounds = true; tileDrawingListLock.AcquireWriterLock(); try { #region -- find tiles around -- tileDrawingList.Clear(); for (long i = (int)Math.Floor(-sizeOfMapArea.Width * scaleX), countI = (int)Math.Ceiling(sizeOfMapArea.Width * scaleX); i <= countI; i++) { for (long j = (int)Math.Floor(-sizeOfMapArea.Height * scaleY), countJ = (int)Math.Ceiling(sizeOfMapArea.Height * scaleY); j <= countJ; j++) { GPoint p = centerTileXYLocation; p.X += i; p.Y += j; if (p.X >= minOfTiles.Width && p.Y >= minOfTiles.Height && p.X <= maxOfTiles.Width && p.Y <= maxOfTiles.Height) { DrawTile dt = new DrawTile() { PosXY = p, PosPixel = new GPoint(p.X * tileRect.Width, p.Y * tileRect.Height), DistanceSqr = (centerTileXYLocation.X - p.X) * (centerTileXYLocation.X - p.X) + (centerTileXYLocation.Y - p.Y) * (centerTileXYLocation.Y - p.Y) }; if (!tileDrawingList.Contains(dt)) { tileDrawingList.Add(dt); } } } } if (GMaps.Instance.ShuffleTilesOnLoad) { Stuff.Shuffle <DrawTile>(tileDrawingList); } else { tileDrawingList.Sort(); } #endregion } finally { tileDrawingListLock.ReleaseWriterLock(); } Interlocked.Exchange(ref loadWaitCount, 0); tileDrawingListLock.AcquireReaderLock(); try { foreach (DrawTile p in tileDrawingList) { LoadTask task = new LoadTask(p.PosXY, Zoom, this); AddLoadTask(task); } } finally { tileDrawingListLock.ReleaseReaderLock(); } { LastTileLoadStart = DateTime.Now; Debug.WriteLine("OnTileLoadStart - at zoom " + Zoom + ", time: " + LastTileLoadStart.TimeOfDay); } updatingBounds = false; OnTileLoadStart?.Invoke(); }
public void NotifyileLoadStart(TileEvent eventArgs) { OnTileLoadStart?.Invoke(this, eventArgs); }