Wolfram mathematica 关于动态、同步更新、内部操纵的问题

Wolfram mathematica 关于动态、同步更新、内部操纵的问题,wolfram-mathematica,Wolfram Mathematica,我试着看看我是否可以在操纵中创建自己的模拟循环,因为我对触发器控件或使用任务都不满意(两者都有问题,我想做的事情也有局限性) 所以,我试着看看我是否可以做我自己的控制循环,这样我可以更好地控制事情,通过点击“运行”按钮,模拟循环将开始,直到点击“停止”按钮 一个基本问题是,即使我使用的是synchronousupdate->False,操纵也会在5秒后超时。i、 e.当我单击“运行”按钮时,我启动一个循环(当然,循环中有一些Pause[]),然后更新循环中的某些内容。这工作正常,但5秒后,循环自

我试着看看我是否可以在操纵中创建自己的模拟循环,因为我对触发器控件或使用任务都不满意(两者都有问题,我想做的事情也有局限性)

所以,我试着看看我是否可以做我自己的控制循环,这样我可以更好地控制事情,通过点击“运行”按钮,模拟循环将开始,直到点击“停止”按钮

一个基本问题是,即使我使用的是
synchronousupdate->False
,操纵也会在5秒后超时。i、 e.当我单击“运行”按钮时,我启动一个循环(当然,循环中有一些
Pause[]
),然后更新循环中的某些内容。这工作正常,但5秒后,循环自行停止,因为操纵决定超时

我可能误解了一些基本的东西。下面是一个简单的例子:

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秒,这是操作的超时值

在外部,其工作正常,如预期:

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

Do[
 (
  x += 1;
  FinishDynamic[];
  Print[x];
  Pause[0.01]
  ), {i, 0, 200}
 ]
我可以把上面的数字调大,没问题

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

谢谢

更新

使用Simon下面给出的方法->“排队”,现在循环工作了。但是这种方法也有问题:我不能在按钮运行时使用Mathematica,即使循环中有很大的停顿,因为它会阻塞整个前端。它的行为就像一直按下按钮一样。所以,这个想法是毫无疑问的。嗯,这是值得一试的

顺便说一句,这是一个很好的时间来提及这一点,我发现使用“code”类型的单元格而不是默认的“input”会导致内核中的许多崩溃。刚刚尝试了单元格类型“代码”,点击几下按钮后,内核崩溃:

所以我不再使用“code”类型的单元格

回到绘图板上

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

使用Mathematica 8.0.1,在windows 7、SP1、intel pc上,以下是使用“代码”单元时使其崩溃的代码

也许有人可以试试上面的?必须点击启动/停止几次才能使其崩溃

我可以复制这个

更新日期:2011年9月2日

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

屏幕截图:


我认为实际上是
按钮
超时了,而不是
操作

要引用的
Options>方法
部分

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


为按钮设置选项
Method->“Queued”
,所有操作均按预期进行。

如果让
操纵
控制“循环”,您可能会获得更好的结果:

我假设这里使用
操纵
来支持实际应用程序中的进一步控制。如果没有,则
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
                       ]
      ]
    }
  ]
]

@谢谢你,西蒙+1,接受。这是我错过的选择!但最后,我发现我不能用这种方法来做我想做的事情。请参阅更新。+1。大约一年前,我也遇到过同样的问题,但很难找出原因(这是一个相当复杂的UI)。仅供参考,自V6以来,我在Windows和Mac上的Mathematica的各种版本上都广泛使用了“代码”样式,我从未见过因使用该样式而导致的崩溃。我已经从“代码”样式的单元格中运行了这个问题中的所有代码,没有出现错误结果(MMA 7.01和8.01,Windows,64位)。另一方面:在我第一次安装MMA V8.00后不久,应用程序字体不知何故被破坏,前端在任何单元格中键入某些字符时就会频繁崩溃。我最后不得不重新安装Mathematica来修复它。我不知道为什么“代码”样式的单元格会给你带来问题。除了边距、背景和默认值
InitializationCell->True
选项之外,它应该与“输入”单元格相同。(@florach-我没有看到你的消息。我应该在发布之前刷新我的浏览器…)纳赛尔:你为什么不能将递增器移到按钮外?e、 g.
操纵[动态[如果[正在运行,x++];刷新[Text@x,TrackedSymbols->{x}]],{x,0},None},{{running,True},None},按钮[Text[“play”],running=True],按钮[Text[“stop”],running=False],TrackedSymbols->{},synchronousUpdate->False]
那么您甚至不需要在“code”单元格中使用
synchronousupdate->False
选项或其他一些东西。我注意到,在执行涉及UI的操作(事件处理程序、鼠标拖动,以及上面的示例)时,使用“代码”代码时崩溃的频率更高。我没有向WRI报告,也许我应该这样做。我刚刚从Mathematica的全新开始,再次尝试了上面的方法,在按键几下后,它再次崩溃,请参见更新2。@Simon,好主意,我会尝试的。我担心不会在循环中暂停,但在上面这样的循环中运行时,它似乎不会影响笔记本会话中的其他Mathematics。我将在我正在编写的另一个更大的演示中尝试你的想法,看看它将如何工作。再次感谢!谢谢,但至少在我的电脑上,Simon在上面的评论中给出的答案运行得快一点,而且手机侧栏不会一直显示为“忙”状态?请查看updateFair。
DynamicModule
版本会使您的Mathematica崩溃吗?您上面的DynamicModule版本不会使我的Mathematica崩溃!那很好。我像以前一样使用“code”类型的单元格,并不断尝试
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
                       ]
      ]
    }
  ]
]