2015-12-10 1 views
-4

Предположим, что у меня есть набор обработчиков событий, и тогда у меня есть этот цикл, который работает, если я запускаю событие, будет ли функция запущена или она застрянет ?Actionscript 3 - Работает ли обработка события отдельно, чем функция

+0

Невозможно ответить на ваш вопрос, не видя фактического кода. – xxbbcc

+0

Тому, кто нажал «закрыть». Не проголосуйте, чтобы закрыть его. Просите ясность. –

ответ

1

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

Таким образом, события могут срабатывать только при наличии пробелов в выполнении. Если у вас запущен цикл, такого промежутка не будет, пока после этого цикла и никакого дополнительного кода не будет выполнено.

Ответ на ваш вопрос: он не будет работать до тех пор, пока цикл не закончится. И любые события, которые запускаются во время выполнения кода, ставятся в очередь и запускаются в порядке, как только возникает пробел в исполнении.

+0

Спасибо за ответ, но можете ли вы дать мне краткий пример о том, как рабочие будут работать (в основном SWF)? – icecreamscoop

+0

@icecreamscoop Рабочие очень отличаются от потоков других платформ. Вы должны обновить свой вопрос тем, что вы на самом деле пытаетесь сделать - маловероятно, чтобы работники были ответом, если вы запустили цикл и подняли событие. – xxbbcc

+0

@icecreamscoop На самом деле я не могу. Я никогда не использовал Рабочих самостоятельно, просто прочитал их. Они имеют сходный результат с потоками на других платформах, но если я правильно напомню, что они ведут себя совсем по-другому и имеют разные цели. –

0

Если вы отправляете события в свой цикл, ваше приложение будет отвечать на них.

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

В следующих примерах будут посланы события:

for (var i:int;i<1000;i++) { 
    // do something 
    dispatchEvent(myEvent); 
} 

... события не будут посланы:

for (var i:int;i<1000;i++) { 
    // do something 
    // no events dispatched while in this loop 
} 

dispatchEvent(myEvent); 

Если вы в течение цикла слишком долго, AIR или Время выполнения Flash Player будет timeout.

Возможно, лучшим подходом было бы использовать рабочий ActionScript в качестве опубликованного другого плаката или проверить время, в течение которого вы были в цикле, и вырваться из него через определенное количество времени. Тогда вы разобьете свою работу на куски.

var landBeforeTime = getTimer(); 

for (var i:int;i<1000;i++) { 
    // do something 
    // check we aren't taking too long 
    if (getTimer()-landBeforeTime>1000){ 
     notDone = true; 
     break; 
    } 
} 

if (notDone) { 
    // come back in the next frame and finish this loop 
    setTimeout (myForLoop, 100); 
} 

Предыдущий код является примером. Вы захотите использовать enterFrame и порядок вещей.