Простое связывание событий в Actionscript. Как я могу принудительно обновить дисплей? - PullRequest
0 голосов
/ 28 января 2011

Я пытаюсь взять процесс, который ранее выполнял несколько вызовов удаленных объектов параллельно, и заставить их работать последовательно.

Я знаю, что это хакерский подход (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 - это частное глобальное логическое значение для класса.В функциях-обработчиках ошибок и откликов-ответов он устанавливается в значение false, так что бесконечный цикл where освобождается и цикл for продолжается.

Это функционально, но пользовательский интерфейс обновляется только послецикл while завершается, что вызывает отрицательный побочный эффект, который приводит к зависанию приложения в ожидании ответа.

Есть ли что-то, что я могу вставить в цикл while, чтобы позволить флэш-памяти обновлять дисплей?В VB (тьфу!) Я бы использовал DoEvents, но я не знаю эквивалента для Actionscript.

Альтернативно, есть ли способ добавить простой система очередей, если полностью переписать приложение?Это устаревший код, и я в сжатые сроки, поэтому я хотел бы изменить его как можно меньше.(В противном случае я бы переписал его с нуля и использовал бы Swiz, чтобы получить цепочку событий.)

Ответы [ 3 ]

2 голосов
/ 29 января 2011

Альтернативно, есть ли способ добавить простая система очередей за исключением полностью переписываете приложение?

Да, вы можете использовать массив. Похоже, что у вас уже может быть, с переменной _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);
 }
}

Затем в вашем обработчике результатов удаленного объекта:

protected function roResultHandler(event:ResultEvent):void{
 // process results

 // process next item in queue
 processItemInQueue();
}
1 голос
/ 29 января 2011

ActionScript является однопоточным, поэтому цикл while (true) действительно будет зависать вечно. Возможно, вы захотите рассмотреть использование класса Timer для регулярного запуска событий или добавления прослушивателя событий в ENTER_FRAME (флеш-плеер думает в домене fps), который запускается в начале каждого кадра.

Если вы посмотрите на ваш код, если ro.process () не является удаленной операцией ввода-вывода (извлечение веб-страницы или вызов веб-службы), они могут повесить пользовательский интерфейс во время выполнения своей работы. Возможно, вы захотите разделить работу и запустить их каждый кадр, а не все сразу. Вы также должны научиться использовать логику EventDispatcher для прослушивания, когда они заканчивают работу или отказывают, вместо установки глобальной переменной и цикла.

0 голосов
/ 29 января 2011

Согласитесь с Климентом - почему бы не сделать все это каким-то событием, а не пытаться делать все в одном цикле?

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

Не должно быть слишком много времени, чтобы написать его, в основном, просто упаковав то, что у вас есть, в один большой диспетчер событий (если ваши текущие процессоры уже отправляют события).

...