I am displaying a progress bar in my notebook like this:
(* prepare global variables for dynamic progress bar ... *)
messages = {{"initial message"}}; (* further messages will be appended to it *)
count = 0;
maxCount = 1; (* initial value>0. It will later be be set to the maximum which count shall actually reach *)
dynAnzeige = (* dynAnzeige is another global variable *)
Column[{Dynamic[count]
, Pane[ProgressIndicator[
Dynamic[count]
, {0, Dynamic[maxCount]}
] (* ProgressIndicator *)
] (* Pane *)
, Dynamic[TextGrid[messages]]
}
]; (* Column *)
(* *)
(* application for lengthy computation ... *)
PrintTemporary[Dynamic[dynAnzeige]]; (* a semicolon is allowed with PrintTemporary *)
maxCount = 4;
(* read data from file and set maxCount to number of lines read... *)
For[count = 1, count <= maxCount (* For loop to process data *)
, AppendTo[messages
, {"waiting " <> ToString[60 + count] <> " seconds."}
];
Print[count]; Pause[60 + count]; (* in my application lengthy processing happen here *)
count++
]; (* For loop to process data *)
Print["finished!"];
Pause[1];
Of course some real computations are done instead of the Pause commands. In some instances, my computations call external programs through Run[“external program …”];
As a rule of the thumb, the external computations take typically 1 minute or a bit longer. In these cases, I see error messages like this:
The kernel is not responding to a dynamic evaluation. You can either choose to abort and restart the kernel or continue waiting. Dynamic updating can be re-enabled using the Dynamic Update Enabled command in the evaluation menu.
Once such a message appears, the following calculation goes entirely wrong. However, if Run[“external program …”];
is outside of the section where PrintTemporary[Dynamic[dynAnzeige]];
is active, my code works.
- How can I temporarily pause the update of
Dynamic[dynAnzeige]
so that the kernel doesn't try to advance the progress bar while the external program is running, - what would I need to write into my code afterwards so that the progress bar is then updated again? Before pausing
Dynamic[dynAnzeige]
I could tell about running an external program through the variable message. The whole progress bar should then remain as it is, without the progress bar moving.
Afterwards I could indicate in message that the external program is finished and start the dynamic update again. It is clear: the kernel has no knowledge about progress of the external program and cannot display the progress of it. But afterwards it should be able to do so again for my Mathematica code.
How do you do this programmatically?
DynamicUpdating
? Example from docs:Style[Dynamic[...], DynamicUpdating -> Dynamic[updating]]
. $\endgroup$