Что делает код (на высоком уровне) это:
Когда вы нажимаете кнопку, вводимые данные настраиваются (testCSVFunc()
- цикл гарантирует, что пустые ячейки исполнителя заполнены ячейкой исполнителя предыдущей строки).
Тогда он (testCSVFunc()
) вызывает enterFrame()
enterFrame()
повторно вызывает finalCSV, добавляя строки «Artist - Title» в текстовое поле.
... до истечения указанного времени. То есть 1000 / 24 - 2 - 2 = прибл. 38 мсек - что соответствует немного меньшей продолжительности кадра при 24 кадров в секунду. Не знаю, почему "- 2 - 2", но идея в том, чтобы каждый кадр оставлял какое-то время, чтобы Flash выполнял другие действия (например, рендеринг сцены).
Когда 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, но в качестве эксперимента по выяснению того, как на самом деле работает "псевдопоточность", это хорошее упражнение для обучения.