diff --git a/src/Gui/Gui.cs b/src/Gui/Gui.cs index 6121d8f..e9f345a 100644 --- a/src/Gui/Gui.cs +++ b/src/Gui/Gui.cs @@ -52,7 +52,9 @@ namespace WorldOfPeacecraft { BufferedGraphics buffer = BufferedGraphicsManager.Current.Allocate (Board.CreateGraphics (), Board.DisplayRectangle); Graphics g = buffer.Graphics; - PaintMap(g); + lock (Backend) { + PaintMap (g); + } buffer.Render(); } diff --git a/src/Parser.cs b/src/Parser.cs index 5524a24..87aa864 100644 --- a/src/Parser.cs +++ b/src/Parser.cs @@ -172,11 +172,15 @@ namespace WorldOfPeacecraft switch (block.GetName ()) { case MessPlayer: Player player = MapPlayer (block); - Backend.removePlayer (player); + lock (Backend) { + Backend.removePlayer (player); + } break; case MessDragon: Dragon dragon = MapDragon (block); - Backend.removeDragon (dragon); + lock (Backend) { + Backend.removeDragon (dragon); + } break; default: ThrowUnknownBlockException(deleteBlock, block); @@ -199,7 +203,9 @@ namespace WorldOfPeacecraft foreach (Block cell in cellsBlock.GetBlocks()) { map.SetTile(MapMapcell(cell)); } - Backend.SetMap(map); + lock (Backend) { + Backend.SetMap (map); + } Backend.RefreshGui(); } @@ -279,12 +285,17 @@ namespace WorldOfPeacecraft private void ProcessPlayer (Block playerBlock) { - Backend.SetPlayer(MapPlayer(playerBlock)); + lock (Backend) { + Backend.SetPlayer (MapPlayer (playerBlock)); + } } private void ProcessMapcell (Block mapcellBlock) { - Backend.getMapObject().SetTile(MapMapcell(mapcellBlock)); + Tile tile = MapMapcell (mapcellBlock); + lock (Backend) { + Backend.getMapObject ().SetTile (tile); + } } private void ProcessYourid (Block yourIdBlock) @@ -313,34 +324,46 @@ namespace WorldOfPeacecraft private void ProcessEntities (Block entitiesBlock) { - Backend.clearDragons (); - Backend.clearPlayers (); - foreach (Block entityBlock in entitiesBlock.GetBlocks ()) { - switch (entityBlock.GetName()) { - case MessPlayer: - Backend.SetPlayer(MapPlayer(entityBlock)); - break; - case MessDragon: - Backend.SetDragon(MapDragon(entityBlock)); - break; - default: - ThrowUnknownBlockException(entitiesBlock, entityBlock); - break; + // This lock can be placed more efficiently. Does it make sense? + lock (Backend) { + Backend.clearDragons (); + Backend.clearPlayers (); + foreach (Block entityBlock in entitiesBlock.GetBlocks ()) { + switch (entityBlock.GetName ()) { + case MessPlayer: + lock (Backend) { + Backend.SetPlayer (MapPlayer (entityBlock)); + } + break; + case MessDragon: + Backend.SetDragon (MapDragon (entityBlock)); + break; + default: + ThrowUnknownBlockException (entitiesBlock, entityBlock); + break; + } } + Backend.RefreshGui(); } } private void ProcessPlayers (Block playersBlock) { - Backend.clearPlayers (); - foreach (Block playerBlock in playersBlock.GetBlocks ()) { - Backend.SetPlayer(MapPlayer(playerBlock)); + // This lock can be placed more efficiently. Does it make sense? + lock (Backend) { + Backend.clearPlayers (); + foreach (Block playerBlock in playersBlock.GetBlocks ()) { + Backend.SetPlayer (MapPlayer (playerBlock)); + } } } private void ProcessDragon (Block dragonBlock) { - Backend.SetDragon(MapDragon(dragonBlock)); + Dragon dragon = MapDragon (dragonBlock); + lock (Backend) { + Backend.SetDragon (dragon); + } } private Dragon MapDragon (Block dragonBlock)