【发布时间】:2011-08-29 10:39:33
【问题描述】:
我正在尝试查看是否可以在 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
]
当运行上面的时候,它总是在 count 58 左右停止,大约是 5 秒,Manipulate 的超时值
在 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,即使循环中有很大的暂停,因为它阻塞了整个前端。它的行为就像按钮一直被按下一样。所以,这个想法是没有问题的。好吧,这是可以尝试的。
顺便说一句,现在是提及这一点的好时机,我发现使用“代码”类型的单元而不是默认的“输入”会导致内核中的许多崩溃。刚刚尝试了单元格类型“代码”,点击几下按钮后,内核崩溃了:
所以我不再使用“代码”类型的单元格。
回到绘图板。
更新 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
]
可能有人可以尝试上述方法吗?必须点击启动/停止几次才能让它崩溃。
我可以重现这个。
2011 年 9 月 2 日更新
关于新答案:在我的电脑 Mathematica 8.0.1 上,看起来 Simon 版本(下面的第二个)似乎更快。我两个同时启动,Simon版本好像跑得更快(计数器跑得更快)。
屏幕截图:
【问题讨论】:
-
仅供参考,自 V6 以来,我在 Windows 和 Mac 上的各种版本的 Mathematica 上广泛使用了“代码”样式,我从未见过由于使用该样式而导致的崩溃。我已经从“代码”样式的单元格中运行了这个问题中的所有代码,没有任何不良结果(MMA 7.01 和 8.01,Windows,64 位)。另一方面:在我第一次安装 MMA V8.00 后不久,应用程序字体以某种方式损坏,前端会经常崩溃,只需在 any 单元格中输入某些字符。我最终不得不重新安装 Mathematica 来修复它。
-
我不确定为什么“代码”样式的单元格会给您带来问题。除了边距、背景和默认
InitializationCell->True选项外,它应该与“输入”单元格相同。 (@WReach - 我没有看到你的消息。我应该在发布之前刷新我的浏览器......) -
Nasser:有什么原因不能将增量器移到按钮之外?例如
Manipulate[ Dynamic[If[running, x++]; Refresh[Text@x, TrackedSymbols -> {x}]], {{x, 0}, None}, {{running, True}, None}, Button[Text["play"], running = True], Button[Text["stop"], running = False], TrackedSymbols -> {}, SynchronousUpdating -> False]那么你甚至不需要SynchronousUpdating->False选项或其他一些东西...... -
在“代码”单元格上。我注意到在处理涉及 UI 的事情(事件处理程序、鼠标拖动和上面的示例)时使用“代码”代码时崩溃的频率更高。我没有向世界资源研究所报告,也许我应该这样做。我刚刚从 Mathematica 的全新开始再次尝试了上述操作,在按钮上按了几次键后,它又崩溃了,请参阅更新 2。
-
@Simon,好主意,会试试的。我担心不会在循环中暂停,但是当它像上面这样在循环中运行时,它似乎不会影响其他数学笔记本会话。将在我正在写的另一个更大的演示中尝试你的想法,看看它是如何工作的。再次感谢!