Actionscript中的简单事件链接。如何强制显示刷新?

我正在尝试采用先前并行运行多个远程对象调用的进程,并使它们以串行方式运行。 我知道这是一种hackish方法(bandaid!),但到目前为止我的方法是采用这个for循环来启动每个并行请求: (原始代码)
for (i = 0; i < _processQ.length; i++){
 fObj = _processQ.getItemAt(i);
 f = fObj.Name;
 fObj.Progress = "Processing..."; 
 ro.process(gameid,f);
}
并将其更改为: (新代码)
for (i = 0; i < _processQ.length; i++){
 fObj = _processQ.getItemAt(i);
 f = fObj.Name;
 fObj.Progress = "Processing..."; 
 ro.process(gameid,f);

 //pause this loop until a result is returned from the request that was just made.
 _pause_queue = true;
 while(_pause_queue){
  //do nothing
 }
}
其中
_pause_queue
是该类的私有全局布尔值。在fault-handler和response-handler函数中,它被设置回false,以便释放无限的where-loop并继续for循环。 这是有用的,但是UI仅在while循环结束后更新,这会导致负面的副作用,即在等待响应时应用程序挂起。 我可以在while循环中放置一些内容以允许flash更新显示吗?在VB(唉!)我会使用
DoEvents
,但我不知道Actionscript的等价物。 或者,有没有办法添加一个简单的排队系统,而不是完全重写应用程序?这是遗留代码,我的截止日期很紧,所以我想尽可能少地修改它。 (否则我会从头开始重写它并使用Swiz来获取事件链。)     
已邀请:
  或者,有没有办法添加一个   简单的排队系统缺乏   完全重写应用程序? 是的,您可以使用数组。看起来你可能已经有一个_processQ变量。我可能会尝试这样的事情:
// A process queue item method
protected function processItemInQueue():Void{
 if(_processQ.length > 0){
  fObj = _processQ.pop();
  f = fObj.Name;
  fObj.Progress = "Processing..."; 
  ro.process(gameid,f);
 }
}
然后在远程Object结果处理程序中:
protected function roResultHandler(event:ResultEvent):void{
 // process results

 // process next item in queue
 processItemInQueue();
}
    
ActionScript是单线程的,因此while(true)循环确实会永远挂起。您可能要考虑的是使用Timer类定期触发事件或向每个帧开始时触发的ENTER_FRAME(flash播放器在fps域中认为)中添加事件侦听器。 查看代码,除非ro.process()是远程IO操作(获取网页或进行Web服务调用),否则他们会在工作时挂起UI。您可能希望拆分工作并每帧都触发它们而不是一次全部触发。您还应该学习如何使用EventDispatcher逻辑在完成或故障时监听,而不是设置全局变量和循环。     
同意clement - 为什么不把它作为一些事件,而不是试图在一个循环中做所有事情?
function outerFunction() {
    var queue = new SomeAsyncProcessor();

    for (i = 0; i < _processQ.length; i++){
        queue.addProcess(_processQ.getItemAt(i));
    }

    queue.addEventListener('complete', handleProcess);
    queue.start();

    game.pause();
}

function handleProcess(event) {

    var processor   = event.currentTarget as SomeAsyncProcessor();
    process.removeEventListener('complete', unpause);

    game.unpause();
}
对于优先级 - 您可以使用此: http://www.polygonal.de/legacy/as3ds/doc/de/polygonal/ds/PriorityQueue.html 也不应该花太多时间写一个,主要是将当前包含的内容包装到一个大事件调度程序中(只要您当前的处理器已经发送事件)。     

要回复问题请先登录注册