wolfram-mathematica - 关于 Manipulate 内部动态同步更新的问题

标签 wolfram-mathematica

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

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

一个基本问题是 Manipulate 在 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
]

当运行上面的代码时,它总是在计数 58 左右停止,也就是大约 5 秒,即 Manipulate 的超时值

enter image description here

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

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

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

我可以让上面的计数尽可能多,没问题。

所以,它似乎是 Manipulate 的一个配置选项,但我现在无法找到我需要使用哪个选项才能使其工作。

谢谢

更新

使用 Simon 下面给出的 Method->"Queued",现在循环工作了。但是这种方法存在问题:我不能在 Button 运行时使用 Mathematica,即使在循环中有很大的暂停,因为它会阻塞整个前端。它的行为就像一直按下按钮一样。所以,这个想法是不可能使用的。好吧,这是值得尝试的事情。

顺便说一句,现在是提这个的好时机,我发现使用“代码”类型的单元而不是默认的“输入”会导致内核崩溃。刚刚尝试了单元格类型“代码”,并在按钮上点击了几下后,内核崩溃了:

enter image description here

所以我不再使用“代码”类型的单元格。

回到绘图板。

更新 2:2011 年 8 月 29 日,下午 6 点

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

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
]

可能有人可以尝试上面的方法吗?必须点击开始/停止几次才能让它崩溃。

我可以复制这个。

enter image description here

2011 年 9 月 2 日更新

关于新答案:看起来 Simon 版本(下面的第二个)在我的 PC Mathematica 8.0.1 上似乎更快。我同时启动了两者,而且 Simon 版本似乎运行得更快(计数器运行得更快)。

屏幕截图:

enter image description here

最佳答案

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

引用 Button docsOptions > Method 部分,

By default, button functions are evaluated on a preemptive link, which times out after 5 seconds:

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

关于wolfram-mathematica - 关于 Manipulate 内部动态同步更新的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7229010/

相关文章:

wolfram-mathematica - Mathematica RegionPlot 在单位球面上?

algorithm - 处理递归函数时如何提高(mathematica)性能?

wolfram-mathematica - 从图形(不是 Hermite)中识别 Mathematica 插值函数

python - scipyIntegrate.tplquad 的不同结果

recursion - 求解形式 p[n,m]==p[n,m-2]+p[n-1,m-1]+p[n-2,m]

wolfram-mathematica - 请参阅 Mathematica 中的前一行输出

wolfram-mathematica - 试图让 Mathematica 逼近积分

for-loop - 进行迭代计划的最佳方法

python - 我可以从 Mathematica 执行远程 python 脚本吗?

在 Mathematica 中选择圆形区域内的点