PDA

Просмотр полной версии : Ограничение на время выполнения кода


Dagi
30.04.2003, 05:21
Уважаемые гуру:) Существует ли способ, при помощи которого можно было бы приодолеть временное ограничение на исполнение кода. Я тут скрипт написал, решающий задачу эйлера об обходе шахматной доски конем. А он слишком долго выполняется. Дополнительная сложность - алгоритм рекурсивный, так что разбросать код по кадрам не получится.
Что делать? Исходник в аттаче.

Usnul
01.05.2003, 01:17
элементарно ватсон, нужно использовать не for, а onClipEvent(enterFrame){}; у него нет лимита на выполнение :) там пиши if и изминения, можно даже ввести маленькие циклы, но не такие как у тебя :)

Dagi
03.05.2003, 08:41
Ну вы меня вообще за идиота держите. Как можно организовать рекурсивный алгоритм с onClipEvent? Бредовость этой идеи не имеет границ. Настоящие спецы - скажите, как победить 15-секундное ограничение на выполнение кода в одном кадре?
p.s. Кстати, уважаемый Usnul, код желательно централизовать, поэтому про onClipEvent забудьте - умные дяди для вас новую модель событий придумали. :)

Dagi
03.05.2003, 08:49
А вот что про это дело пишет Macromedia:
Issue
While viewing a Flash movie in any Flash Player environment (browser, standalone, or projector), an error message appears indicating that a script is causing the Player to run slowly. Additionally, the message box gives the viewer the option to abort the script, as can be seen in Example 1.


Reason
The Flash Player itself provides this option to abort the script. The Flash Player will do this when it plays a movie which contains a one-frame ActionScript loop which can repeat itself indefinitely or for too long. A movie with such a loop can tax the resources of the computer system playing it. Giving viewers the option to end the script helps the Flash Player prevent an SWF file from freezing the viewer's browser or system.

Solution
To avoid creating a movie that triggers this error message when it is played in the Flash Player, create a loop that goes through frames. You can do this by evaluating a variable in an if statement and, if the variable conditionalizes as true, then have the movie break the loop by going to the next frame. If the variable does not conditionalize as true, then have the movie loop back to the first frame (usually two to three frames back) of the movie.

Usnul
03.05.2003, 15:49
лимит не побить, и я пытался с тобой как с человеком :mad:
если тебя не устраивают копромисы пиши свой флэш

Dagi
03.05.2003, 20:34
Просто, прежде чем давать советы, нужно убедиться, что они верны

Usnul
04.05.2003, 01:20
короче так, если тебе все же охото чтобы "все работало" то делай без for а если нет, то садись за програминг :)

Dagi
04.05.2003, 07:33
Без циклов - элементарно. А вот без рекурсии - никак. А ведь время ограничено и на выполнение функции. Кстати, я этот же код загнал в HTML как JavaScript - так там то же ограничение. В общем, не решить задачу Эйлера на Actionscript

Usnul
04.05.2003, 14:55
Знаешь, мне жуууутко неохото разбераться, но по моему у тебя там есть несколько простейших ошибок, то есть строчки не там стоят некоторые, посмотри по внимательнее

TTS
04.05.2003, 18:15
Можно эмулировать рекурсию.
По-моему, не так сложно.

Dagi
04.05.2003, 20:00
В коде ошибок нет. Чтобы это проверить, достаточно запустить обход не 64, а, например, 60 клеток.

Dagi
04.05.2003, 20:04
Эмулировать рекурсию... Интересно... Прошу пример... А вообще, любой рекурсивный алогритм можно заменить нерекурсивным - другой вопрос, какой он будет по размеру и сколько будет выполняться... Вот я теряюсь пока в догадках, как можно посторить обход дерева с возвратом без рекурсии

TTS
05.05.2003, 01:09
Вот так сходу, коряво:////////////////////// Создаём стек /////////////////////////////
var stack=null;
function push(){
var e=new Object();
e.prev=stack;
e.arguments=arguments;
stack=e;
}
function pop(){
if(stack!=null){
var e=stack;
var arg=e.arguments;
stack=e.prev;
delete e;
return arg;
} else return null;
}
/////////////////////////////////////////////////////////

function mypow(a,b){
createEmptyMovieClip("recur",1);
recur.a=a;
recur.b=b;
recur.onEnterFrame=function(){
if(--recur.b==0){
recur.onEnterFrame=function(){
if((arg=pop())!=null){
recur.a*=arg[0];
}else{
trace(recur.a);
delete recur.onEnterFrame; // END
}
}
}else push(recur.a);
}
}

mypow(2,20);