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