Асинхронный порыв в AS3? - PullRequest
       1

Асинхронный порыв в AS3?

1 голос
/ 03 февраля 2012

Я нашел какой-то код, который разбивает интенсивные циклы, так что рендеринг экрана все еще может происходить.

Я почти все заработал - единственное, что мне нужно, это нажимать кнопку «Пуск», чтобы получитьчерез весь процесс, вместо того, чтобы делать это автоматически - я не понимаю «возврат» должным образом:

test_csv_btn.addEventListener(MouseEvent.CLICK, testCSVFunc);

function testCSVFunc ( event : Event ) {

    for (var i:uint = 0; i < csv.data.length; i++) {        

        if (csv.data[i][colArtist] == '') {         

            csv.data[i][colArtist] = csv.data[i-1][colArtist];

        }       
    }

    enterFrame();
}


//pseudo code
var allowedTime = 1000/24 - 2 - 2;
var startTime = 0;
var savedIndex = 0;


function enterFrame() {

    startTime = getTimer();

    var i, n = csv.data.length;
    for (i=savedIndex; i<n; i++){

        if (getTimer() - startTime > allowedTime){
            savedIndex = i;
            return;
        }
        trace(i);
        finalCSV(csv.data[i]);
    }

    //complete();
    trace ('done');
}


function finalCSV ( file ) {    

    if (file[colTitle] != '') {             

        trace(file[colTitle]);
        csvHolder.csvText.appendText(file[colArtist]+' -- '+file[colTitle]+'\n');
    }

}

Как есть, enterFrame работает до тех пор, пока не достигнут предел таймера, а затем останавливается.Чтобы возобновить его, мне нужно нажать test_csv_btn для итерации по следующему фрагменту и так далее, пока все не будет сделано.

Как заставить процесс продолжаться автоматически до завершения?Кажется, он возвращается к testCSVFunc в конце каждого блока и останавливается.

Спасибо за вашу помощь.

Ответы [ 3 ]

0 голосов
/ 04 февраля 2012

Что делает код (на высоком уровне) это:

  1. Когда вы нажимаете кнопку, вводимые данные настраиваются (testCSVFunc() - цикл гарантирует, что пустые ячейки исполнителя заполнены ячейкой исполнителя предыдущей строки).

  2. Тогда он (testCSVFunc()) вызывает enterFrame()

  3. enterFrame() повторно вызывает finalCSV, добавляя строки «Artist - Title» в текстовое поле.

  4. ... до истечения указанного времени. То есть 1000 / 24 - 2 - 2 = прибл. 38 мсек - что соответствует немного меньшей продолжительности кадра при 24 кадров в секунду. Не знаю, почему "- 2 - 2", но идея в том, чтобы каждый кадр оставлял какое-то время, чтобы Flash выполнял другие действия (например, рендеринг сцены).

  5. Когда 38 мсек были потрачены на обработку, он останавливается (оператор return) - и больше ничего не будет делать, пока вы не нажмете снова (в этот момент он будет вызван из testCSVFunc() и продолжит он остановился на savedIndex). testCSVFunc будет продолжать обрабатывать данные до тех пор, пока i < n больше не станет истинным - то есть, когда в CSV больше не останется элементов.

Полагаю, идея в том, что testCSVFunc вызывается только один раз. Он устанавливает все данные (повторный вызов приводит к добавлению одних и тех же данных в «список задач» еще раз). Затем finalCSV должен обработать эти данные и добавить их в текстовое поле.

Это означает, что enterFrame() не должен вызываться напрямую testCSVFunc (который вызывается щелчком мыши) - он должен вызываться один раз в каждом кадре (отсюда и имя), пока все данные не будут обработаны.

т.е. вместо того, чтобы вызывать enterFrame(), вы устанавливаете его как обработчик события ENTER_FRAME:

addEventListener(Event.ENTER_FRAME, enterFrame); 

Таким образом, при нажатии запускается «нить», и enterFrame() будет выполняться каждый кадр.

Не забудьте добавить параметр event:Event в объявление enterFrame() - даже если вы его не используете. В противном случае вы получите ошибку об отсутствующем параметре:

function enterFrame(event:Event):void {
   ...    
}

Когда закончится обработка (когда цикл больше не повторяется, потому что i < n больше не имеет значения true), было бы неплохо снова отключить обработчик событий, т. Е .:

// done
removeEventListener(Event.ENTER_FRAME, enterFrame);
trace('done');

В противном случае он будет продолжать вызывать «рабочий метод», даже если у него больше не будет работы.

В целом, это означает, что каждый кадр, большая часть времени кадра (38 мсек) будет потрачен на заполнение текстового поля, после чего может выполняться рендеринг сцены. Я бы, вероятно, установил allowedTime несколько ниже этого значения.

Как говорит Weltraumpirat, есть обобщенные реализации, которые, вероятно, более эффективны и, вероятно, позаботятся об особенностях Flash, но в качестве эксперимента по выяснению того, как на самом деле работает "псевдопоточность", это хорошее упражнение для обучения.

0 голосов
/ 12 марта 2014

Вы пробовали работников ?Они позволяют создавать одновременно исполняемые потоки без обходных путей.

0 голосов
/ 03 февраля 2012

Используемое вами поведение называется «псевдопоточность», и вы можете найти ряд обобщенных реализаций в Интернете. Вы можете найти тот, который напоминает потоки Java, в библиотеке as3commons и / или проверить это руководство , чтобы узнать об основах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...