【问题标题】:ActionScript, possible race condition on mouse eventActionScript,鼠标事件的可能竞争条件
【发布时间】:2016-01-15 12:42:07
【问题描述】:

我在这里有点茫然。我有一个问题,我认为可能是由于鼠标事件优先。我有一个函数f 在鼠标点击时被调用-f 做了一些工作,然后调用另一个函数gf 是否有可能运行,然后发生另一次点击 - 再次调用 f - 然后 g 被执行?

如果我的措辞难以理解,我会尝试说明我认为可能发生的情况:

    click1 -----       /-----------\
                \     /             \
                  f --      f--      g    g
                           /   \         /
      click2 ------------ /     \--------

 |---------------- timeline----------------------|

我可以肯定地说,只有在非常快速地连续单击两次(而且并非总是如此)时才会出现问题(大约 50 次慢速双击和大约 50 次快速双击)。我意识到我的数字可能比它澄清的更令人困惑,但我不确定如何传达我的想法。非常感谢任何输入!

【问题讨论】:

  • 我认为您根本没有描述这个问题。无论如何,事件上没有发生竞争条件,所有代码都在执行期间。
  • 我故意没有描述这个问题,因为如果这不是原因,那么它可能在一个相当大的代码库中的任何地方(无法在一个问题中总结发生的所有事情)。所以你确定鼠标点击事件不会中断正在运行的代码?您有任何参考资料来支持您的主张吗? P.S.:很抱歉,如果我遇到困难,我只是想确定一下,以便我可以继续研究其他可能性。
  • 您是否记录了对fg 的调用以查看订单是否符合您的预期?

标签: actionscript-3 apache-flex mouseevent flex3 air2


【解决方案1】:

AS3 是一个单线程代码执行环境,它将执行所有相关代码。如果单击触发了一系列方法的执行,则所有这些方法都将在任何其他代码再次执行之前运行。因此,由于 AS3 代码的单线程性质,因此在代码执行中不能存在竞争条件。

在这方面,AS3 中的所有事件都不是特例,当它们的侦听器触发时,其所有代码都以相同的方式执行,并且在完成之前无法执行其他代码。

特殊情况是:

  • 您可以使用计时器暂停执行,这样代码的执行将在以后发生。在这种情况下,无法保证这些计时器的触发将与其启动顺序同步。

  • 执行异步命令(比如加载某些东西),这种情况下也不保证加载操作会按顺序进行。

但是这些特殊情况并没有违反AS3中的代码执行原则,所有代码都在一个线程中执行,因此它们不能有任何重叠。

【讨论】:

    猜你喜欢
    • 2013-04-13
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2021-12-07
    • 2017-07-17
    • 2019-09-09
    • 1970-01-01
    相关资源
    最近更新 更多