动态问题,SynchronousUpdating,Manipulate内部

Nas*_*ser 2 wolfram-mathematica

我试图看看我是否可以在Manipulate中创建自己的模拟循环,因为我对Trigger控件或使用Tasks都不满意(两者都有我想做的问题和限制).

所以,我试图看看我是否可以创建自己的控制循环,这样我可以更好地控制事物,通过单击"运行"按钮,模拟循环将开始,直到单击"停止"按钮.

一个基本问题是,即使我正在使用,操作也会在5秒后超时SynchronousUpdating -> False.也就是当我点击"运行"按钮时,我开始循环(Pause[]当然有一些循环),然后将在循环中更新某些内容.这样可以正常工作,但是5秒后,循环自行停止,因为Manipulate决定超时.

我可能会误解一些基本的东西.我在下面举例说明:

Manipulate[
Dynamic[Refresh[Text@x,TrackedSymbols->{x}]],

{{x,0},ControlType->None},
{{running,True},ControlType->None},

Button[Text["play"],
  {
   running=True,
   While[running,
     x+=1;
     FinishDynamic[];
     Pause[0.1]
   ]
  }],

Button[Text["stop"],
    running=False
  ],

TrackedSymbols->{None},
SynchronousUpdating->False,
SynchronousInitialization->False
]
Run Code Online (Sandbox Code Playgroud)

运行上述操作时,它总是在大约58秒左右停止,大约是5秒,即Manipulate的超时值

在此输入图像描述

在Manipulate之外,它按预期工作正常:

x = 0;
Dynamic[Refresh[x, UpdateInterval -> 0.001]]

Do[
 (
  x += 1;
  FinishDynamic[];
  Print[x];
  Pause[0.01]
  ), {i, 0, 200}
 ]
Run Code Online (Sandbox Code Playgroud)

我可以把数量大到我想要的数量,没问题.

因此,它似乎是Manipulate的一个配置选项,但我现在无法找到它需要使用哪个选项才能使用它.

谢谢

更新

使用Simon下面给出的方法 - >"排队",现在循环工作.但是这个方法存在问题:我在Button运行时不能使用Mathematica,即使循环中有大的暂停,因为它会阻塞整个前端.它的行为就像按下按钮一直一样.所以,这个想法是不可能的.嗯,这是尝试的东西.

顺便说一句,这是一个提及这个的好时机,我发现使用'code'类型的单元而不是默认的'input'导致内核中出现很多崩溃.刚刚尝试了单元格类型的"代码",只需点击几下按钮,内核就崩溃了:

在此输入图像描述

所以我不再使用"代码"类型的单元格.

回到绘图板.

更新2:8/29/11,下午6点

使用Mathematica 8.0.1,在Windows 7,SP1,intel pc上,这里是使用"代码"单元时崩溃的代码

Manipulate[
Dynamic[Refresh[Text@x,TrackedSymbols->{x},UpdateInterval->0.005]],

{{x,0},ControlType->None},
{{running,True},ControlType->None},

Button[Text["play"],
  {
   running=True,
   While[running,
     x+=1;
     FinishDynamic[];
   ]
  },Method->"Queued"],

Button[Text["stop"],
    running=False
  ],

TrackedSymbols->{None},
SynchronousUpdating->False,
SynchronousInitialization->False
]
Run Code Online (Sandbox Code Playgroud)

可能有人可以尝试以上?不得不点击开始/停止几次让它崩溃.

我可以重现这个.

在此输入图像描述

更新9/2/11

在新的答案:看起来西蒙版(下面的第二个)在我的电脑上似乎更快,Mathematica 8.0.1.我同时开始,Simon版本似乎运行得更快(计数器运行得更快).

屏幕截图:

在此输入图像描述

Sim*_*mon 8

我认为实际上Button是超时,而不是Manipulate.

引用Button文档Options > Method部分,

默认情况下,按钮功能在抢先链接上进行评估,该链接在5秒后超时:

设置Method -> "Queued"按钮的选项,一切都按预期工作.