Предположим, что у меня есть набор обработчиков событий, и тогда у меня есть этот цикл, который работает, если я запускаю событие, будет ли функция запущена или она застрянет ?Actionscript 3 - Работает ли обработка события отдельно, чем функция
ответ
Flash, по большей части, однопоточный. Это означает, что он может делать только одно дело сразу. (Вы можете использовать Рабочих в настоящее время, чтобы обойти это, но мы будем игнорировать их ради этого ответа)
Таким образом, события могут срабатывать только при наличии пробелов в выполнении. Если у вас запущен цикл, такого промежутка не будет, пока после этого цикла и никакого дополнительного кода не будет выполнено.
Ответ на ваш вопрос: он не будет работать до тех пор, пока цикл не закончится. И любые события, которые запускаются во время выполнения кода, ставятся в очередь и запускаются в порядке, как только возникает пробел в исполнении.
Спасибо за ответ, но можете ли вы дать мне краткий пример о том, как рабочие будут работать (в основном SWF)? – icecreamscoop
@icecreamscoop Рабочие очень отличаются от потоков других платформ. Вы должны обновить свой вопрос тем, что вы на самом деле пытаетесь сделать - маловероятно, чтобы работники были ответом, если вы запустили цикл и подняли событие. – xxbbcc
@icecreamscoop На самом деле я не могу. Я никогда не использовал Рабочих самостоятельно, просто прочитал их. Они имеют сходный результат с потоками на других платформах, но если я правильно напомню, что они ведут себя совсем по-другому и имеют разные цели. –
Если вы отправляете события в свой цикл, ваше приложение будет отвечать на них.
Если у вас есть цикл, который делает свое дело, и ваш код, который отправляет события, находится за пределами этого, тогда ваше приложение не получит эти события во время цикла.
В следующих примерах будут посланы события:
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 и порядок вещей.
Невозможно ответить на ваш вопрос, не видя фактического кода. – xxbbcc
Тому, кто нажал «закрыть». Не проголосуйте, чтобы закрыть его. Просите ясность. –