Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ошибка #1502 (Выполнение сценария превысило 15 секунд) (http://www.flasher.ru/forum/showthread.php?t=210441)

illusion21 13.06.2015 09:58

Добавлено через 33 секунды
Цитата:

Сообщение от illusion21 (Сообщение 1183531)
Добавлено через 38 минут
illusion21,мне кажется,в твоем случае ,может быть, оно выскакивает, когда юзер пытается закрыть окошко с игрой.Выскакивает алерт с подтверждением и пока юзер на нем тупит наступает таймаут(если изначально речь об этом бильярде шла).Хотя, учитывая что огонь в камине в это время продолжает гореть, нельзя сказать, что в флэшке все умерло

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

По таймингу в логах я все же не могу понять, выше писали что ошибка могла произойти раньше (да и смотреть нужно не позже 1512.320 все что позже, по действующим законам нашей планеты, не подходит под больше 15 сек). Так если бы в пределах 1512 что-то завесило бы процесс, то весь остальной код дальше бы просто не мог вообще выполняться, насколько я понимаю.. а он успешно выполнялся... Насколько я понимаю, у флэши нет многопоточности. Если какой-то процесс завис бы на 15 секунд то зависло бы все, никакие евенты не срабатывали бы, никакие функции не выполнялись на протяжении этих самых 15 секунд. Или как?[/quote]

AlexCooper 13.06.2015 12:55

Нет, наглядный пример
Код AS3:

trace('sync call');
setTimeout( function():void { trace('async call');} , 1000 );
throw new Error('Something happened error');


undefined 13.06.2015 15:48

Цитата:

Так если бы в пределах 1512 что-то завесило бы процесс, то весь остальной код дальше бы просто не мог вообще выполняться
Думаю имелось в виду, что произошел стектрейс, приложение стало нестабильным,юзер ничего не заметил и продолжил играть и дальше эта нестабильность вылезла вот в такой таймаут.Но опять же тогда должна быть инициирующая ошибка. Чего не наблюдается.По крайней мере в моем случае.

AlexCooper 14.06.2015 18:14

Цитата:

Сообщение от undefined (Сообщение 1183554)
Но опять же тогда должна быть инициирующая ошибка. Чего не наблюдается.По крайней мере в моем случае.

То что вы её не видете, не означает что её нет. Более того, ваш результат выполнения программы, имеет инициализацию написанною неВами.

Как я уже писал
Цитата:

Сообщение от AlexCooper (Сообщение 1183508)
Решение дописать статический (что-бы иметь всегда прямую ссылку) класс, с статус лейблами. По типу
Код AS3:

Debug.moduleEnabled(ModuleType.VIEW);
Debug.runstack.run( OperationType.LOGIN );
Debug.runstack.complete( OperationType.LOGIN );

и статистику с картой событий, статусами модулей, какие отработали, какие готовы ( можно так же отправлять на удалённый хост )

Так как
Цитата:

Сообщение от illusion21 (Сообщение 1182880)
сейчас опять попробовал проанализировать откуда может взяться эта ошибка... смотрю лог и не вижу никакого смысла в том что я вижу:

1525.399 Network game: sync passed
1525.566 Network recieved: CMD_RETRANSLATE
1525.566 MSG_WATCH
1525.566 TIMER START
1525.881 Lobby onClientCommand, 5
1526.148 Network recieved: CMD_RETRANSLATE
1526.148 MSG_SCORE
1526.148 Network: recieved CL_KICK_STARTED, 26081, 15
1526.998 Network recieved: CMD_RETRANSLATE
1526.998 MSG_CHANGE_BALL
1527.319 catched uncaught error
1527.320 SocketClient send, 255
1527.320 SocketClient send complete
1527.320 uncaught error: Error: #1502

Собрал Вам небольшой пример
Код AS3:

package debug
{
        import flash.utils.Dictionary;
 
        public class ModulesGuide
        {
                public static function module(point:int, processing:Boolean):void
                {
                        if (processing) {
 
                                if ( hasFalse( point) )        {
                                        _statusMask |= point;
                                } else {
                                        // duplication enabled
                                }
 
                        } else {
 
                                if ( hasTrue( point ) ) {
                                        _statusMask ^= point;
                                } else {
                                        // duplication disabled
                                }
                        }
                }
 
                public static function getModuleLive(status:Boolean = true):Vector.<String>
                {
 
                        var links:Dictionary = route.getLinks();
 
                        var res:Vector.<String> = new Vector.<String>;
 
                        var checker:Function;
 
                        switch (status) {
                                case true:
                                        checker = hasTrue;
                                        break;
 
                                case false:
                                        checker = hasFalse;
                                        break;
                        }
 
                        for ( var key:String in links) {
 
                                if ( checker( links[key] ) ) res.push( key );
                        }
 
                        return res;
                }
 
                public static function bind(type:String):void {
                        route.bind( type );
                }
 
                public static function keyOfType(type:String):int {
                        return route.typeConvertor( type );
                }
 
                private static var _statusMask:int = 0x0;
                private static var _route:ModuleLinkages;
 
                private static function hasTrue( key: int ):* {
                        return _statusMask & key;
                }
 
                private static function hasFalse( key: int ):* {
                        return hasTrue(key) ^ key;
                }
 
                private static function get route():ModuleLinkages {
 
                        if (!_route) _route = new ModuleLinkages();
                        return _route;
                }
        }
 
}
 
import flash.utils.Dictionary;
internal class ModuleLinkages {
 
        public function ModuleLinkages() {
 
                step        = 0;
                register= 0x1;
                range        = 0x10;
 
                claster = new <int>
                        [        0x1,
                                0x2,
                                0x4,
                                0x8
                        ];
 
                linkages = new Dictionary();
        }
 
        public function getLinks():Dictionary {
                return linkages;
        }
 
        public function bind(humanIdKey:String):void {
 
                if (linkages.hasOwnProperty(humanIdKey)) {
                        throw new ArgumentError('Already reservation Key :: '+humanIdKey);
                        return;
                }
 
                linkages[humanIdKey] = newKey;
        }
 
        public function typeConvertor(type:String):int
        {
                if (linkages.hasOwnProperty( type ) ) {
                        return linkages[type];
                }
 
                return 0;
        }
 
        private function get newKey():int{
 
                var key:int = register*claster[step++];
 
                if (step == claster.length) {
                        step = 0;
                        register *= range;
                }
 
                return key;
        }
 
        private var linkages:Dictionary;       
 
        private var step:int;
        private var register:int;
        private var range:int;
        private var claster:Vector.<int>;
}

Код AS3:

package
{
        import flash.utils.getTimer;
 
        import debug.ModulesGuide;
 
        public class Debug
        {
                private static var history:Vector.<String> = new Vector.<String>;
 
                public static function lazyStartLifecycle( type:String ):void {
                        module(type,true,true);
                }
 
                public static function lazyStopLifecycle( type:String ):void {
                        module(type,false);
                }
 
                public static function reservationTypes( type:String ):void {
                        ModulesGuide.bind( type );       
                }
 
                public static function module( type:String, completeLabel:Boolean, autobind:Boolean = false ):void {
 
                        if (autobind) reservationTypes( type );
 
                        var key:int = ModulesGuide.keyOfType(type);
                        logger("Module[ "+type+" ] <"+key+"> :: "+ completeLabel);
 
                        if (key) {       
                                ModulesGuide.module
                                (        key,
                                        completeLabel
                                );
                        } else {
                                logger("Unregistered key[ "+type+" ]");
                        }
                }
 
                public static function getLifecycleLive():Array{
 
                        return rebuilder(
                                ModulesGuide.getModuleLive()
                        );
                }
 
                public static function getLifecycleDead():Array{
 
                        return rebuilder(       
                                ModulesGuide.getModuleLive(false)
                        );
                }
 
                public static function getLifecycleLiveString():String{
 
                        return rebuilder(
                                Debug.getLifecycleLive()
                        ).join("\n");
                }
 
                public static function getLifecycleDeadString():String{
 
                        return rebuilder(
                                Debug.getLifecycleDead()
                        ).join("\n");
                }
 
                public static function getHistory():String{
                        return history.join("\n");
                }
 
                public static function logger( msg:String ):void {
 
                        var msec:Number = getTimer();
                        var sec:Number = Math.floor(.001*msec);       
                                msec -= (sec*1000);
 
                        var timeFormat:String = String(sec)+'.'+String(msec);
                        var delim:String = " :: ";
 
                        history.push( timeFormat + delim + msg );
                }
 
                private static function rebuilder(obj:*):Array {
                        var res:Array = new Array();
 
                        for each(var data:* in obj) {
                                res.push(data);
                        }
                        return res;
                }
        }
}

Как пользоваться
Код AS3:

package
{
        import flash.display.Sprite;
 
        public class SomeApp extends Sprite
        {
                public function SomeApp()
                {
                        Debug.module('module1',true,true); // начало работы модуля1
                        Debug.module('module1',false);      // конец работы модуля1
                        Debug.module('module2',false,true);// конец работы модуля2
                        Debug.module('module3',true,true); // начало работы модуля3
 
                        trace( Debug.getLifecycleLiveString() );
                        trace( Debug.getLifecycleDeadString() );
                }
        }
}

Добавлено через 4 минуты
или с предварительной резервацией имён модулей
Код AS3:

public function SomeApp2()
{
        Debug.reservationTypes( TYPE.SOMETYPE_1 );
        Debug.reservationTypes( TYPE.SOMETYPE_2 );
        Debug.reservationTypes( TYPE.SOMETYPE_3 );
 
        Debug.module( TYPE.SOMETYPE_1, true );
        Debug.module( TYPE.SOMETYPE_1, false);
        Debug.module( TYPE.SOMETYPE_2, false);
        Debug.module( TYPE.SOMETYPE_3, true);
 
        trace( Debug.getLifecycleLiveString() );
}

Добавлено через 6 минут
ну и для ленивых
Код AS3:

Debug.lazyStartLifecycle( 'SOMETYPE_1' );
Debug.lazyStopLifecycle( 'SOMETYPE_1' );

Добавлено через 8 минут
история
Код AS3:

Debug.getHistory()

вообще м я думаю разберётесь

illusion21 16.06.2015 14:23

извините за тупость... а что этот пример делает? Что он должен показать?

AlexCooper 16.06.2015 22:11

Вы можете отслеживать выполнился ли код, от участка
Код AS3:

Debug.lazyStartLifecycle( 'имя_метки1' );

до
Код AS3:

Debug.lazyStopLifecycle( 'имя_метки1' );

и в момент
Цитата:

Сообщение от illusion21 (Сообщение 1182880)
1527.319 catched uncaught error
1527.320 SocketClient send, 255
1527.320 SocketClient send complete
1527.320 uncaught error: Error: #1502

отправить на сервер число-битовую_маску ModulesGuide._statusMask
и посмотреть какие участки выполнились, а какие нет. Тем самым обнаружить, где произошло зависание.
Всё прошивать я думаю, не стоит, но как минимум путём дробления на половины, можно будет найти тот кусок кода, который ушёл в бесконечность.

illusion21 16.06.2015 23:45

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


Часовой пояс GMT +4, время: 20:40.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.