【问题标题】:question on dynamic, SynchronousUpdating, inside Manipulate关于 Manipulate 内部动态、同步更新的问题
【发布时间】: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,好主意,会试试的。我担心不会在循环中暂停,但是当它像上面这样在循环中运行时,它似乎不会影响其他数学笔记本会话。将在我正在写的另一个更大的演示中尝试你的想法,看看它是如何工作的。再次感谢!

标签: wolfram-mathematica


【解决方案1】:

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

引用Button docsOptions > Method 部分,

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

为按钮设置选项Method -> "Queued",一切正常。

【讨论】:

  • @谢谢西蒙。 +1,接受。这是我错过的选项!但最后,我发现我不能用这种方法做我想做的事。请查看更新。
  • +1。大约一年前我遇到过同样的问题,男孩很难找出原因(这是一个相当复杂的 UI)。
【解决方案2】:

如果你让Manipulate控制“循环”,你可能会得到更好的结果:

Manipulate[
  If[running, x++, x]
, {{x, 0}, ControlType -> None}
, {{running, True}, ControlType -> None}
, Button["play", running = True]
, Button["stop", running = False]
]

我认为Manipulate 在这里被用来支持实际应用程序中的进一步控制。如果没有,那么DynamicModule 就足够了。

DynamicModule[{x = 0, running = True}
, Column[
    { Button["play", running = True]
    , Button["stop", running = False]
    , Dynamic[If[running, x++, x]]
    }
  ]
]

以下示例使用此技术为移动的磁盘设置动画:

DynamicModule[{t = 0, running = True}
, Column[
    { Button["play", running = True]
    , Button["stop", running = False]
    , Dynamic[
        If[running, t++, t] /.
          t_ :> Graphics[Disk[{Cos[t/10], Sin[t/10]}]
                       , PlotRange -> {{-3,3},{-3,3}}
                       , Axes -> True
                       ]
      ]
    }
  ]
]

【讨论】:

  • 谢谢,但似乎至少在我的电脑上,西蒙在上面的评论中给出的答案运行得更快了,并且单元格侧栏不会一直显示为“忙碌” ?请看更新
  • 很公平。 DynamicModule 版本是否会使您的 Mathematica 崩溃?
  • 您上面的 DynamicModule 版本没有使我的 Mathematica 崩溃!那很好。我像以前一样使用“代码”类型的单元格,并一直试图让它崩溃,但它没有。我需要向 WRI 发送错误报告,说明当单元格是如上所示的代码时发生的上述崩溃。
猜你喜欢
  • 2019-08-13
  • 2011-02-26
  • 1970-01-01
  • 2011-03-24
  • 2015-04-29
  • 2011-07-27
  • 2021-06-21
  • 2011-10-15
  • 1970-01-01
相关资源
最近更新 更多