Here is an example of using `ProgressIndicator`. I added `Pause[]` to simulate some blocking operation, and added Abort button. This is the pattern that I use when using this feature. It is simple and works for me. The idea is to pass the tracking symbol by reference. 

    Manipulate[(*example using progress monitor in Manipulate*)
     Module[{result},
      abort = False; track=0;
      result = solve[n, Unevaluated[track], Unevaluated[abort]];
      track = 0;
      If[abort, "Aborted", "success!"]],
     Grid[{
       {Control[{{n, 10, "size of problem?"}, 1, 1000, 1, Appearance -> "Labeled"}]},
       {Button["Abort", abort = True, ImageSize -> {40, 30}]},
       {Dynamic[ProgressIndicator[track, {0, 1}]]} }],
     {{track, 0}, None},
     {{abort, False}, None},
     TrackedSymbols :> {n},
     SynchronousUpdating -> False,
     ContinuousAction -> False,
     Initialization :>
      (
       solve[n_, track_, abort_] := Module[{k = 0, result = 1},
         Do[PrimeQ[i];
          Pause[0.1];
          k = k + 1;
          track = k/n;
          If[abort, result = -1; Break[]]
          , {i, n}
          ];
         
         result
         ]
       )
     ]

![enter image description here][1]


  [1]: https://i.sstatic.net/bAR2f.gif