MathGroup Archive 2008

[Date Index] [Thread Index] [Author Index]

Search the Archive

Timing out while waiting for Manipulate code to load

  • To: mathgroup at smc.vnet.net
  • Subject: [mg89975] Timing out while waiting for Manipulate code to load
  • From: "David Park" <djmpark at comcast.net>
  • Date: Wed, 25 Jun 2008 06:30:12 -0400 (EDT)

Here is a definition for a generic button that will evaluate a command and 
color the button that was last used.

ClearAll[StepButton];
Attributes[StepButton] = {HoldFirst};
StepButton[stepvalue_, steplabel_, stepnumber_] :=
 Function[{step, stepnum},
  Button[steplabel, step = stepvalue; stepnum = stepnumber,
   Background ->
    If[stepnum == stepnumber, ColorData["Legacy"]["Gold"], White],
   BaseStyle -> {FontSize -> 14},
   Method -> "Queued"],
  {HoldAll}
  ]

Here are three expressions that we will use the buttons to evaluate. Two of 
them are Manipulate statements and they are at the center of the problem. 
Note that the Manipulate statements end with a semi-colon so they are not 
actually displayed.

step0 = "Hi There! Now push the step1 button.";
step1 = Manipulate[x, "Step1", {x, 0, 1}];
step2 = Manipulate[y, "Step2", {y, 1, 2}];

Here is the expression that creates the display of the three buttons. By 
pushing the buttons you will be able to switch amoung the various displays.

Module[
 {step = step0, stepnum = 0},
 Column[{
   Panel[
    Dynamic@Grid[
      {{StepButton[step0, "step0", 0][step, stepnum],
        StepButton[step1, "step1", 1][step, stepnum],
        StepButton[step2, "step2", 2][step, stepnum]}}](* Grid *),
    Style["Demonstrating of Timing Problem", 16],
    BaseStyle -> {FontSize -> 14,
      PanelBoxOptions -> {Background -> LightBlue}}](*
   Structure Panel *),
   Dynamic[step]
   }](* Column *)
 ]

Now, in a fresh Mathematica session (if you have used Manipulate it is not 
sufficient to just kill the kernel), paste these three pieces of code in a 
notebook and evaluate in order. Step0 will be displayed and the button will 
be highlighted. Now push the step1 button, which must evaluate a Manipulate 
statement. After a wait, about 15-20 seconds on my machine, the evaluation 
will be aborted. You will not obtain the Manipulate display. But if you then 
push any of the other buttons everything will be all right, and when you go 
back to the step1 button, it will now also work. Furthermore, if you kill 
the kernel and reevaluate the problem will not occur again. Even if you kill 
the kernel and close the notebook and then paste the code into a new 
notebook, everything will work.

I think the initial Abort may occur because of the time for the Manipulate 
code to load. That is why I used the Method -> "Queued" option in the Button 
statement. That did not solve the problem and I think that may be because it 
only affects kernel functions and this is a front end function. Well, I'm 
not very certain of the reason so perhaps someone can enlighten me.

If the semi-colon is removed from the step1 or step2 definition, so that the 
Manipulate box is actually displayed, then the problem does not occur. But 
in my application these are actually quite large displays and I don't want 
to display them twice. What I am actually doing now is using a small dummy 
Manipulate statement that displays and this is done in a subsection that a 
viewer might not actually look at.

Is there a more elegant way to solve this problem? Is there a way to get the 
frontend Manipulate code loaded without actually displaying something? Or is 
there a way to get the Button not to Abort while waiting for the Manipulate 
code to load?

-- 
David Park
djmpark at comcast.net
http://home.comcast.net/~djmpark/




  • Prev by Date: Re: Re: How to add a title to a cell and then collapse
  • Next by Date: Re: Package File for Different Mathematica Versions
  • Previous by thread: Re: NMaximize problem
  • Next by thread: Re: Timing out while waiting for Manipulate code to load