在长循环期间,Flex等效于ProcessMessages和无响应的UI

Ass*_*vie 11 apache-flex user-interface

我发现我的Flex应用程序的UI在很长的处理循环(几十秒)内变得没有响应.例如,在处理非常大的XML文件并对每个元素执行某些操作时...

是否有"ProcessMessages"的等价物?也就是说,一个调用会告诉Flex继续响应UI事件,即使在一些长循环的中间,这样UI也不会无响应?

我知道Flex是单线程设计.这就是为什么我正在寻找像ProcessMessages()这样的函数 - 一个允许单线程可重入应用程序(如VB或基于单线程消息循环的C++应用程序)在长时间运行期间保持响应的函数.

答案摘要

  1. 有没有像内置函数HandleEvents()ProcessMessages()Flex中.
  2. 使用某种回调机制迭代地处理长计算过程的块,同时在块之间屈服于运行时,从而使其能够响应,是在长计算期间维持响应UI的唯一方法.
  3. 完成上述方法的方法是:
    1. 使用enterFrame事件,只要Flex应用程序下面的Flash"影片"图层刷新其帧(类似于20fps),就会调用该事件.
    2. 使用计时器.
    3. 使用UIComponent.callLater()哪些计划工作"稍后"完成.(正如文档所说:Queues a function to be called later. Before each update of the screen, Flash Player or AIR calls the set of functions that are scheduled for the update.
    4. 使用有意触发的鼠标/键盘事件来创建伪"工作线程",如本例所示.

如果有进一步的建议,或者我遗漏了任何东西,请随时编辑这个(现在的)维基片.

Dav*_*nak 6

问题是Flash是单线程的,即在代码的一部分运行之前,不能进行其他处理.你会以某种方式将处理分解成更小的块,并在enterFrame事件中执行这些块.

编辑:我担心低估这个(或西蒙的)答案并不会改变这在AS3中不可行的事实.阅读本文以获得有关该问题的更多信息.该文章还包括一个名为PseudoThread的简单"库",它有助于执行长背景计算.不过,你仍然需要将问题分解成更小的部分.